我有一个视图来创建一个用户,如下所示。
<% 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
是嫌疑人。所以在action中返回视图之前添加一行如下。
[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 的值。
我们找到了治疗症状的方法,但问题的根源在哪里?
我不喜欢每次在返回另一个视图之前清除视图数据字典的想法。