2012-08-31 6 views
5

多くの状況では、投稿された値の結果としてサーバー上に作成されたモデルがあるという問題がありました。モデルを処理すると、モデル値の一部が変更され、ページ上に再表示されます。私のモデル値の代わりにPOSTed値を使用するMVCフレームワークを引き起こす動作をオーバーライドするいくつかの簡単な方法はありますか?MVC3:POSTされた値ではなくモデル値を使用するようにHtml.TextBoxForを強制する方法

例:このページが最初にロードされると

モデル

public class MyModel { 
    public string Value1 { get; set; } 
} 

コントローラ

public MyController : Controller { 
    public ActionResult MyAction() { 
     var model = new MyModel(); 
     model.Value1 = "OldValue"; 
     return View(model); 
    } 
    [HttpPost] 
    public ActionResult MyAction(MyModel model) { 
     model.Value1 = "NewValue"; 
     return View(model); 
    } 
} 

ビュー

@using(Html.BeginForm("MyAction", "My", FormMethod.Post) { 
    @Html.TextBoxFor(m => m.Value1) 
    <input type="submit"/> 
} 

、テキストボックスに "OldValueプロパティ" を含んでいます。 submitをクリックすると、テキストボックスにはまだ「OldValue」が含まれています。これはサーバーにPOSTされたものですが、モデルの値(NewValue)の2番目のページ(POST後)を作成する必要があります。

MVCにこのような振る舞いをさせる簡単な方法はありますか?私はこの状況で私が望む結果を得るために何をすべきかについて本当に確信していません。

注 - これはすべて擬似コードなので、いくつかのエラーがあるかもしれませんが、コンセプトはそこにあるはずです。

答えて

8

あなたのポストリダイレクト(ポストリダイレクト - パターンを取得)で。

[HttpPost] 
    public ActionResult MyAction(MyModel model) 
    { 
     var newModel = new MyModel(); 
     newModel = model; 
     ModelState.Clear(); 
     newModel.Value1 = "NewValue"; 
     return View(newModel); 
    } 
+0

おかげで、私の例では、簡略化されていると私は本当にただGETにリダイレクトする必要はありません。私はこの作業をすることができると思いますが、モデルにPOSTされた値をオーバーライドさせるソリューションを期待していました。 –

+0

@LeslieHanks - 誤解をおかけして申し訳ありません、私の編集をご覧ください。 –

+0

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

0

を編集したモデルをバック合格する

[HttpPost] 
public ActionResult MyAction(MyModel model) { 
    model.Value1 = "NewValue"; 
    return RedirectToAction("MyAction"); 
} 

EDIT

クリアモデル状態ビルトインヘルパーでそれを行う方法がありません。あなたは名前を取得するためにヘルパーを使って手動で

それをしなければならない。あなたの提案を

<input type="text" name="@Html.NameFor(m => m.MyField)" value="@Model.MyField"/> 
関連する問題