2011-01-29 10 views
41

私は複数ステップのファイルインポートプロセスを持っています。ビューモデルから「CurrentStep」を入力しようとしています。Hiddenforビューモデルから正しい値を取得できません

CurrentStepは列挙型で、私はビューモデルに提供したものではなく、常にデフォルト値を取得します。私が間違って何をやっている:私はちょうど手のコードが隠された入力でしたが、私が知りたいの実現

<p><% = Model.CurrentStep %></p> 

:一方で、これは私に正しい値を取得しますか? POST間の現在のステップを追跡する良い方法はありますか?

ありがとうございます。

+0

フォームのコード(Html.BeginForm()など)を表示してください。 –

答えて

62

あなたが間違っているのは、コントローラのアクションでPOSTされた変数の値を変更しようとしていることです。だから私はあなたがこれをやろうとしていると仮定します。このようHiddenForなど

[HttpPost] 
public ActionResult Foo(SomeModel model) 
{ 
    model.CurrentStep = Steps.SomeNewValue; 
    return View(model); 
} 

とhtmlヘルパーは常に最初にPOSTされた値を使用して、モデル内のその値の後になります。

だから、あなたは可能性のカップルを持っている:

  1. がにModelStateから値を削除します。

    [HttpPost] 
    public ActionResult Foo(SomeModel model) 
    { 
        ModelState.Remove("CurrentStep");    
        model.CurrentStep = Steps.SomeNewValue; 
        return View(model); 
    } 
    
  2. を手動

    <input type="hidden" name="NextStep" value="<%= Model.CurrentStep %>" /> 
    
  3. 隠しフィールドを生成するカスタムを書きますあなたのモデルの価値を使用するヘルパー

+2

ありがとうございます。私は、ビューモデルの全体のポイントは、ビュー(少なくともViewDataに含まれるよりも複雑な)情報をビューに渡すことだと思いました。だからViewはView Modelを使用していません。 POST varsに入っていたものは何でも入手できますか?それは私にとってはあまり意味がありません。 – user427875

+4

ありがとう、素晴らしい答え。 (1)の場合は、ModelState.Clear()を使用してすべての値を削除することもできます。 – tkerwood

+2

@ダリン・ディミトロフ:私たちも同様の問題を抱えていて、あなたの投稿は私たちを多く助けました。しかし、私たちが得られないもの、そしておそらくあなたが答えを持っているのは、それがなぜこれを行うのかです。 .cshtmlのモデルの値で見かけ上上書きしても、POSTから値を取得するのはなぜですか。 –

4

私のソリューションは、オプション1(モデル状態からクリアする)は、文字列をハードコーディング意味(と命名規則が複雑なモデルとトリッキーなことができる)ので、ダーリンの2番目のオプションを使用していた、と避けたかった投稿をingが私はすでに非常に多くのカスタムヘルパーを持っているので、オプション3。あなたはきれいなものを維持するためにHtml.NameForを使用することができます

<input type="hidden" name="@Html.NameFor(x => Model.SomeId)" value="@Model.SomeId" />

だけリマインダー。

関連する問題