ASP.NET MVC ModelBinderバグ:モデルのプロパティ「ID」へのバインディングリクエスト変数「ID」
-
27-10-2019 - |
質問
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
の上 Comment
に CommentId
正しく価値がありますか 0
?
私はデフォルトのモデルバインダーがに結合していると思います {id}
ルートの。
解決
これは、HTMLヘルパーを使用している場合、HiddinForなどのHTMLヘルパーを使用している場合、最初にルートデータとモデル状態を見て、その後モデルで見ます。そのため、ルートデータでパラメーターID = 2を見つけ、渡すモデルでID = 0の代わりにこの値を使用します。
他のヒント
これはバグです。または、以下の実装ロジックのためではないかもしれません。
ASP.NET MVCでは、ビューエンジンが使用します Viewdata (それは可変であり、そのタイプは「ViewDaticdictionary」です)。この Viewdata ルーティング値を保持する2つのプロパティ「ModelState」と、実際のモデルオブジェクトを保持する「モデル」があります。
- ビューエンジンは、プロパティの値を取得する「モデルステート」オブジェクトを調べます。
- ステップ1で見つかった場合、値を返します。
- それ以外の場合は、「モデル」オブジェクトを調べて、プロパティの値を取得します。
上記の場合、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})