iT邦幫忙

0

ActionResult 取值問題?

Luke 2018-06-21 09:11:085666 瀏覽
  • 分享至 

  • xImage

controller如下:

 public ActionResult QueryInfo(AViewModel vm)
 {
    if(string.IsNullOrWhiteSpace(vm.QUERY_DATE))
       vm.QUERY_DATE = DateTime.Today.ToString("yyyyMMdd");//沒有輸入  日期查詢 帶今天日期
    vm.HeaderList = db.QueryHeaderList(vm.QUERY_DATE);
    return View(vm);
}
public ActionResult QueryInfo()
{ 
    var vm = new AViewModel();
    string qDate = DateTime.Today.ToString("yyyyMMdd");//第一次沒有資料 所以帶今天日期
    vm.QUERY_DATE = qDate;
    vm.HeaderList = db.QueryHeaderList(qDate);
    return View();
}

view 如下:

@using (Html.BeginForm("QueryInfo", "QueryInfo", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true, "", new { })
    <table style="width:100%; border-spacing:0;">
        <tr>
            <th class="header">@Html.LabelFor(model => model.QUERY_DATE)</th>
            <td>
                @Html.TextBoxFor(model => model.QUERY_DATE)
                @Html.ValidationMessageFor(vm => vm.QUERY_DATE, "", new { })
            </td>
            <th class="header"> </th>
            <td> </td>
        </tr>
        <tr>
            <td colspan="4" align="right"><input type="submit"></td>
        </tr>
        <tr>
        <td colspan="4" align="center">
          <table style="width:95%; border-spacing:0;">
                <thead>
                    <tr>
                        <td class="header">料號</td>
                        <td class="header">批次</td>
                        <td class="header">日期</td>
                        <td class="header">狀態</td>
                        <td class="header">訊息</td>
                    </tr>
                </thead>
                @foreach (var item in Model.HeaderList)
                {
                <tr>
                    <td>@item.MATERIAL</td>
                    <td>@item.BATCH</td>
                    <td>@item.MO_DAT</td>
                    <td>@item.STATUS</td>
                    <td>@item.MSG</td>
                </tr>
                }
        </td>
        </tr>
</table>

在第一次進來 ,會去執行controller ==> public ActionResult QueryInfo(),查詢日期(QUERY_DATE)會帶出來(今天)
當使用者按下查詢送出 ,會去執行controller ==> public ActionResult QueryInfo(AViewModel vm)

請問
那使用者 QUERY_DATE 沒有輸入,是空的,那controller 內加入判斷,自動加入今天日期
為什麼畫面上不會有帶出日期(QUERY_DATE)?

https://ithelp.ithome.com.tw/upload/images/20180621/20096781TpxPVd3j8U.png

優悠 iT邦新手 3 級 ‧ 2018-06-21 09:23:03 檢舉
第二個 QueryInfo()要return View(vm); 你忘了帶VM
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
小魚
iT邦大師 1 級 ‧ 2018-06-21 12:05:51

前端要加上

@model Model命名空間.AViewModel

使用的時候

@Model.XXX(變數或方法名稱)

p.s. 你應該不會單純到直接把這些文字複製貼上吧, 然後問我為什麼不能用吧...

可以參考 我的鐵人賽文章

Luke iT邦研究生 5 級 ‧ 2018-06-21 13:22:24 檢舉

加了,怎麼可能沒有加,
沒有加第一次 Default 的,帶出今天日期就會出錯。

現在是當使用者,將日期清除,點選送出
在controller 有去判斷是否由時間,沒有就自動帶出今天日期

if(string.IsNullOrWhiteSpace(vm.QUERY_DATE))
       vm.QUERY_DATE = DateTime.Today.ToString("yyyyMMdd");//沒有輸入  日期查詢 帶今天日期
    vm.HeaderList = db.QueryHeaderList(vm.QUERY_DATE);
    return View(vm);

自動帶出今天日期,前端帶不出來?

小魚 iT邦大師 1 級 ‧ 2018-06-22 00:06:54 檢舉

很少用這種方式,直接用Html標籤不會有這個問題,

找到資料了,這是ASP.NET MVC的問題,
可以參考 這一篇

解決方法

@Html.TextBoxFor(model => model.QUERY_DATE, new { Name = "vm.QUERY_DATE" } )

vm是你後端接收的Model名稱,在Html這一行會變成

<input name="vm.QUERY_DATE" id="QUERY_DATE" type="text" value="20180621">
0
Homura
iT邦高手 1 級 ‧ 2018-06-21 14:13:17

老實說我對MVC不太熟
我早上看到也是一直在玩為什麼會有你說得這狀況

說一下我試出的狀況

我的controller

public ActionResult Index()
{
    ViewModel vm = new ViewModel();

    vm.name = "name";
    vm.phone = "phone";


    return View(vm);
}
[HttpPost]
public ActionResult Index(ViewModel vm)
{
    var result = new ViewModel();
    result.name = "postName";
    result.phone = "postPhone";

    return View(result);
}

我的View

@model WebApplication1.Models.ViewModel

@{
    ViewBag.Title = "Home Page";
}


<div class="row">
    @using (Html.BeginForm("Index", "Home", FormMethod.Post))
    {
        <h3>Name: @Html.TextBoxFor(model => model.name)</h3>
        <h3>Phone: @Html.TextBoxFor(model => model.phone)</h3>
        <input type="submit" value="送出" />

    }
    <h3>Name: <input value="@Model.name" /> </h3>
    <h3>Phone: @Html.TextBoxFor(model => model.phone)</h3>

</div>

上面我故意多寫的同樣ViewModel在Form外面
然後一個是小魚說的@Model.XXX(變數或方法名稱)
測試結果小魚說的那個會改變

然後我刪掉Form裡面的phone的ViewModel
改成這樣

    @using (Html.BeginForm("Index", "Home", FormMethod.Post))
    {
        <h3>Name: @Html.TextBoxFor(model => model.name)</h3>
        
        <input type="submit" value="送出" />

    }
    <h3>Name: <input value="@Model.name" /> </h3>
    <h3>Phone: @Html.TextBoxFor(model => model.phone)</h3>

測試結果Form外面的phone值也會變了...
感覺他是有錯誤但是卻沒報出來的感覺

然後開版的那種狀況一開始沒傳vm回view的狀況
改成有傳入vm回View
還有

<input type="text" name="QUERY_DATE" value="@Model.QUERY_DATE" />

應該就行了

補充一下
剛發現如果在Form裡面的話
使用

@Html.TextBoxFor(model => model.name)

Form裡和外面都有同樣的值
改其中一個值後PostBack
傳回來2個值都會改變成回傳前前端修改的值

其實不是錯誤
有點像是保存使用者輸入的機制
導致Form裡面會保存下來
Form外面的會刷新

看更多先前的回應...收起先前的回應...
Luke iT邦研究生 5 級 ‧ 2018-06-21 15:06:07 檢舉
<input value="@Model.QUERY_DATE" />

那我用的是

<td>
@Html.TextBoxFor(model => model.QUERY_DATE)
@Html.ValidationMessageFor(vm => vm.QUERY_DATE, "", new { })
</td>

因為我後面還有 ViewModel , Validate
new ValidationResult("時間格是不對,無法轉換日期。", new string[] { "START_DATE" });

不過您這個寫法,資料沒有在BeginForm 送到後Controller

Homura iT邦高手 1 級 ‧ 2018-06-21 15:11:10 檢舉

TWLuke
因為你沒有name

<input type="text" name="QUERY_DATE" value="@Model.QUERY_DATE" />

不好意思我沒打完整應該還要個type

Homura iT邦高手 1 級 ‧ 2018-06-21 15:34:56 檢舉

TWLuke
我有補充一些東西你可以看一下

小魚 iT邦大師 1 級 ‧ 2018-06-21 20:27:22 檢舉

應該是

name="QUERY_DATE"


不過後端也要有一個AViewModel接資料...
而且必須是Post方法...

Homura iT邦高手 1 級 ‧ 2018-06-21 22:35:47 檢舉

小魚
對吼
因為我沒有display屬性名稱
他直接幫我抓欄位名稱了
感謝修正

我要發表回答

立即登入回答