2011-01-06 51 views
11

多分私は何か不足しているかもしれませんが、同じアクションにポストバックするフォームがあると、テキストボックスの値は古い値に戻ります。次の例では、各POSTのテキストボックスの値をインクリメントする必要があります。これは起こらず、モデルの値がインクリメントされ、モデルは有効です。Modelstateはポストバック時に有効ですが、Textboxは古い値に戻ります

ただし、HttpPostアクション(コード内のコメント)でモデルステートをクリアすると、すべて正常に動作します。

何か不足していますか?ここで

はコードです:

モデル:

public class MyModel 
{ 
    public int MyData { get; set; } 
} 

ビュー:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.MyModel>" %> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
<% using (Html.BeginForm()) {%> 
    <%: Html.TextBoxFor(m => m.MyData)%> (<%: Model.MyData%>) 
        <%: Html.ValidationMessageFor(m => m.MyData) %> <br /> 
    State :<%: ViewData["State"] %> <br /> 
    <input type="submit" /> 
<% } %> 
</asp:Content> 

コントローラー:

public class HomeController : Controller 
{ 
    [HttpGet] 
    public ActionResult Index() 
    { 
     return View(new MyModel { MyData = 0 }); 
    } 

    [HttpPost] 
    public ActionResult Index(MyModel myModel) 
    { 
     // ModelState.Clear(); 
     ViewData["State"] = "invalid"; 
     if (ModelState.IsValid) 
      ViewData["State"] = "Valid"; 

     var model = new MyModel { MyData = myModel.MyData + 1 }; 
     return View(model); 
    } 

} 

答えて

8

私はこのオンラインの答えを見つけました。

トリックはあなたが使用する必要がありますいずれかのこれらの2件の記事

http://forums.asp.net/p/1527149/3687407.aspx

Asp.net MVC ModelState.Clear

+0

ありがとうございました。私はModelStateをクリアすることがうまくいくことを知っていました。なぜなら、それが有効なモデルのために行われなければならない理由は分かりませんでした。最初のリンクには、Brad Wilsonのコメントがあります。これは設計上のものであり、モデルは有効かどうかにかかわらず、ModelStateを常に使用します。もう一度表示(使用可能なModelStateを使用するため)。 –

+0

多くの感謝!私も助けてくれました..素晴らしい作品.. – Aaron

+0

モデルの状態をクリアしないでください - http://blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc- s-html-helpers-render-the-wrong-value.aspx –

2

読む詳細についてモデル

[HttpPost] 
public ActionResult Index(MyModel myModel) 
{ 
    // ModelState.Clear(); 
    ViewData["State"] = "invalid"; 
    if (ModelState.IsValid) 
     ViewData["State"] = "Valid"; 

    var model = new MyModel { MyData = myModel.MyData + 1 }; 

    ModelState.Clear(); 

    return View(model); 
} 

を返す前にModelStateをクリアすることですPost-Redirect-Get patternかHtmlヘルパーを使用しないでください。

リファレンス:http://blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc-s-html-helpers-render-the-wrong-value.aspx

基本的にMVCデータをモデルに優先して再表示するためのポストから任意の再表示が検証エラーであることを期待し、ポストされたデータを再利用し(図ModelState)。指針はではなく、です。ModelState.Clear()です。

関連する問題