[英]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.