5

これは非常に明白なことであるに違いありませんが、私にとっては非常に奇妙に見えます。単純なコントローラー、1つのプロパティを持つモデル、およびプロパティの値を表示し、そのプロパティのエディターをレンダリングするビューがあります。ボタンをクリックすると、フォームが投稿され、感嘆符がプロパティに表示されます。この感嘆符は私のビューに表示されますが、タグにのみ表示され、によってレンダリングされたタグpには表示されません。inputHtml.TextBoxFor()

Html.TextBoxFor()アクション後にモデルを更新したことを無視するのはなぜですか?

この動作を変更する方法はありますHtml.TextBoxFor()か?

意見

@model ModelChangeInPostActionNotVisible.Models.IndexModel

@using (Html.BeginForm())
{
    <p>@Model.MyProperty</p>
    @Html.TextBoxFor(m => m.MyProperty)
    <input type="submit" />
}

モデル

namespace ModelChangeInPostActionNotVisible.Models
{
    public class IndexModel
    {
        public string MyProperty { get; set; }
    }
}

コントローラ

namespace ModelChangeInPostActionNotVisible.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View(new IndexModel { MyProperty = "hi" });
        }

        [HttpPost]
        public ActionResult Index(IndexModel model)
        {
            model.MyProperty += "!";
            return View(model);
        }
    }
}

送信ボタンをクリックした後のHTML

<form action="/" method="post">    <p>hi!</p>
<input id="MyProperty" name="MyProperty" type="text" value="hi" />    <input type="submit" />
</form>
4

2 に答える 2

10

これは仕様によるものです。

ヘルパーメソッドはModelStateを使用しているため、リクエストの応答が同じモデルを使用している場合は、投稿された値が表示されます。

これは、検証が失敗した場合に同じビューをレンダリングできるようにするためです。

新しい情報を確実に表示するには、ModelState.Clear();戻る前に:を追加します。

詳細はこちら: http: //blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc-s-html-helpers-render-the-wrong-value.aspx

namespace ModelChangeInPostActionNotVisible.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View(new IndexModel { MyProperty = "hi" });
        }

        [HttpPost]
        public ActionResult Index(IndexModel model)
        {
            model.MyProperty += "!";
            ModelState.Clear();
            return View(model);
        }
    }
}
于 2012-11-20T01:52:14.027 に答える
6

Yan Brunetは、コントローラーで変更するために変数をModelStateから削除する必要があることは絶対に正しいです。ただし、ModelState全体をクリアする必要はありません。次の手順を実行して、変更する変数のみを削除できます。

 ModelState.Remove("MyProperty");

これは、ユーザーが入力した他の値を保持したい場合に役立ちます。

于 2013-06-13T15:36:48.117 に答える