2012-01-05 3 views
11
public ActionResult SomeAction(int Id){ 
    //Id is set to 2 

    var model = //get some thing from db using Id(2); 
    //Now model.Id is set to 9; 

    return View(model); 
} 

----------View---------- 
@Html.HiddenFor(x => x.Id) 

ソースを表示すると、この非表示フィールドは2ではなく9に設定されます。代わりにモデルにマップする方法URLルーティング情報へのマッピング?HiddenFor(x => x.Id)にViewModelの代わりにUrlParameterが設定されています

P.S.私はルーティング情報を変更しない限り、私はいい探しているURLを失うので、私はパラメータの名前を変更しないことを好むだろう。私はそれをして、それは動作しますが、私が望むものではありません。

+0

ビューをレンダリングする前にモデル値を適切に設定していないようです。それはあなたが見ているものを記述する唯一の方法だと思われます。 –

+0

あなたはあなたのビューに@モデルを入れてみましたか? –

+0

はい、私はモデルに正しくマッピングされているビューにいくつかの他の "HiddenForの"があります。このマップのみが正しくマッピングされていません。アクションのパラメータ名をidからx_idに変更した後、正常に機能しました。しかし、私のURLは "/ account/2"から "/ account?x_id = 2"になりました。 –

答えて

24

フレームワークは、クエリ文字列の値を、ポスト・データ、ルーティング値などに基づいてModelStateCollectionを構築し、このModelStateCollectionViewに渡されます。実際のモデルから値を取得する前に、すべてのHTML入力ヘルパーがModelStateCollectionの値を最初にに取得しようとします。

入力モデルはint idですが、出力モデルは新しいモデルであるため、Idという特性名が一致するため、ヘルパーはModelStateCollection(クエリ文字列の)の値を使用します。

それはあなたが手動でビューに新しいモデルを返す前にModelStateCollectionをクリアする必要が動作するように:

public ActionResult SomeAction(int Id){ 
    //Id is set to 2 

    ModelState.Clear(); 

    var model = //get some thing from db using Id(2); 
    //Now model.Id is set to 9; 

    return View(model); 
} 
+2

ありがとう、あなたは紳士と学者です。 –

+1

いいですが、必要なものがあればモデルステートをクリアするように注意してください(ここでは、diffのパラメータ名やモデル名を考慮する必要があります) –

+0

詳細についてはhttp://blogs.msdnで説明しています。com/b/simonince/archive/2010/05/05/asp-net-mvc-s-html-helpers-render-the-wrong-value.aspx –

4

あなたは正確に何をしたいことが、本質的には同じことをしない場合があり

<input id="Id" type="hidden" value="@Model.Id" /> 

の下にこれを試みることができます。 Actionが呼び出されるとき

+0

私はこれもうまくいきました、ありがとうと思います。 –

0

あなたはそれが

@Html.TextBoxFor(x => x.Id, new { @style="visibility:hidden; width:4px;"}) 

としてTextBoxForを使用してCSSを使用してそれを隠しすることができます私のために働いた。

関連する問題