簡體   English   中英

在ASP.NET MVC中查看數據字典覆蓋模型數據

[英]View data dictionary overriding model data in ASP.NET MVC

我有一個如下創建用戶的視圖。

<% using (Html.BeginForm("SaveUser", "Security")) {%>
    <p>
        <label for="UserName">UserName:</label>
        <%= Html.TextBox("UserName") %>
        <%= Html.ValidationMessage("UserName", "*") %>
    </p>
    <p>
        <label for="Password">Password:</label>
        <%= Html.TextBox("Password") %>
        <%= Html.ValidationMessage("Password", "*") %>
    </p>
    <p>
        <input type="submit" value="Create" />
    </p>
<}%>

單擊“創建”按鈕后,HTML表單將發布到名為“ SaveUser”的操作,該操作僅接受“ POST”動詞,如下所示。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SaveUser( UserViewModel user)
{
    //user.Id is zero before save
    //Save the user.  Code omitted...
    //user.Id is now greater than zero
    //redirect to edit user view
    return View("EditUser", user );
}

保存用戶后,頁面將通過以下方式重定向到“ EditUser”視圖:

<p>
    <label for="Id">Id:</label>
    <%= Html.Hidden("Id", Model.Id)%>
</p>

這是問題所在:盡管隱藏字段的值始終顯示為零。 Model.Id大於零。 似乎有其他東西正在覆蓋模型視圖的值。 ViewDataDictonary是可疑的。 因此,在返回操作中的視圖之前,添加了一行,如下所示。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SaveUser( UserViewModel user)
{
    //user.Id is zero before save
    //Save the user.  Code omitted...
    //user.Id is now greater than zero

    //clear the view data
    ViewData = new ViewDataDictionary();
    //redirect to edit user view
    return View( "EditUser", user);
}

果然,這可行。 現在,隱藏字段的值就是正確的用戶ID。

我們找到了一種治療症狀的方法,但是問題的根源在哪里?

我不喜歡每次返回另一個視圖之前都要清除視圖數據字典的想法。

成功操作后,您應該使用

return RedirectToAction("EditUser", new { id = user.Id });

或類似的代碼。 當前的ModelState用於生成視圖,並且模型綁定器未綁定ID。

[Bind(Exclude = "Id")]也可以工作,但是重定向會創建新頁面(不使用當前的ModelState),這是一個更好的解決方案。

編輯:

如果不想綁定整個對象,則應使用[Bind (Exclude)]或僅將SaveUser定義為SaveUser(string userName, string password)然后自己構建UserViewModel對象。 這將使您免受模型綁定程序和模型值生成的錯誤(您不知道錯誤來自何處)的困擾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM