0

次のようにユーザーを作成するビューがあります。

<% 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 の値が含まれるようになりました。

症状を治療する方法を見つけましたが、問題の原因はどこにあるのでしょうか?

別のビューを返す前に毎回ビュー データ ディクショナリをクリアするという考えは好きではありません。

4

1 に答える 1

4

操作が成功したら、使用する必要があります

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

または類似のコード。現在の ModelState はビューを生成するために使用され、モデル バインダーは Id をバインドしませんでした。

[Bind(Exclude = "Id")]動作する可能性もありますが、リダイレクトは新しいページを作成し (現在の ModelState を使用しない)、より良い解決策です。

編集:

オブジェクト全体をバインドしたくない場合は、使用するか、 asを[Bind (Exclude)]定義して自分でオブジェクトを構築する必要があります。これにより、どこから来たのかわからない、モデル バインダーとモデル値によって生成されるエラーを回避できます。SaveUserSaveUser(string userName, string password)UserViewModel

于 2009-10-13T14:42:02.163 に答える