0

MVC3ファイナルRTMを使用しています。

与えられた

このルート:

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

そして、投稿のページ、たとえば/ blog / posts / 2 / some-slugで、部分ビューを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}ルートのにバインドされていると思います。

4

4 に答える 4

2

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

于 2011-03-19T09:13:40.413 に答える
1

これはバグであるか、以下に実装されているロジックが原因ではない可能性があります。

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

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

上記の場合、ルートにはプロパティ「id」があり、その値は「ModelState」に保存されるため、バインドされたモデルではなく「ModelState」から値を返します。

上記のシナリオでは、入力コントロールは予期しない値でレンダリングされます。

解決策は次のとおりです。

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

//use below jquery function to retrieve data
var postedData = $('.postData');
于 2011-03-19T09:32:51.780 に答える
0

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

于 2011-03-19T00:01:43.047 に答える
0

試す:

Try @Html.Partial("_CommentEditor", new Comment{Id = 0}) 
于 2011-03-19T00:20:58.567 に答える