次のようにユーザーを作成するビューがあります。
<% 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>
<}%>
「作成」ボタンをクリックすると、次のように「POST」動詞のみを受け入れる「SaveUser」というアクションに HTML フォームがポストされます。
[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 の値が含まれるようになりました。
症状を治療する方法を見つけましたが、問題の原因はどこにあるのでしょうか?
別のビューを返す前に毎回ビュー データ ディクショナリをクリアするという考えは好きではありません。