ASP.NET MVC ModelBinderバグ:モデルのプロパティ「ID」へのバインディングリクエスト変数「ID」

StackOverflow https://stackoverflow.com/questions/5358913

質問

MVC 3 Final RTMを使用しています。

与えられた

このルート:

context.MapRoute(
    "Blog_Posts",
    "Blog/Posts/{id}/{slug}",
    new { controller = "Posts", action = "Index", slug = UrlParameter.Optional }
);

そして、投稿のページで、EG/blog/posts/2/some-lug iは部分的なビューをでバインドします Comment モデル:

@Html.Partial("_CommentEditor", new Comment())

Comment があります public int Id {get; set;}.

そして、部分的な見解では、私はこれを持っています:

@Html.HiddenFor(comment => comment.Id)

なぜこれを表示するのですか?

<input type="hidden" value="2" name="Id" id="Id" data-val-required="The Id field is required." data-val-number="The field Id must be a number." data-val="true">

そして、なぜ私が変更したとき Id の上 CommentCommentId 正しく価値がありますか 0?

私はデフォルトのモデルバインダーがに結合していると思います {id} ルートの。

役に立ちましたか?

解決

これは、HTMLヘルパーを使用している場合、HiddinForなどのHTMLヘルパーを使用している場合、最初にルートデータとモデル状態を見て、その後モデルで見ます。そのため、ルートデータでパラメーターID = 2を見つけ、渡すモデルでID = 0の代わりにこの値を使用します。

他のヒント

これはバグです。または、以下の実装ロジックのためではないかもしれません。

ASP.NET MVCでは、ビューエンジンが使用します Viewdata (それは可変であり、そのタイプは「ViewDaticdictionary」です)。この Viewdata ルーティング値を保持する2つのプロパティ「ModelState」と、実際のモデルオブジェクトを保持する「モデル」があります。

  1. ビューエンジンは、プロパティの値を取得する「モデルステート」オブジェクトを調べます。
  2. ステップ1で見つかった場合、値を返します。
  3. それ以外の場合は、「モデル」オブジェクトを調べて、プロパティの値を取得します。

上記の場合、Routeにはプロパティ「ID」があり、その値は「ModelState」に保存されるため、バイクモデルの代わりに「ModelState」から値を返します。

上記のシナリオでは、入力制御は予期しない値をレンダリングします。

解決は次のとおりです。

<div class="postData" value='@Model.Id'/>

//use below jquery function to retrieve data
var postedData = $('.postData');

LINQをSQLに使用している場合、データベースによって提供されるようにマークされたフィールドを手動で設定することはできません。

試す:

Try @Html.Partial("_CommentEditor", new Comment{Id = 0}) 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top