Ошибка ASP.NET MVC ModelBinder: привязка переменной запроса "id" к свойству модели "Id" - PullRequest
0 голосов
/ 19 марта 2011

Я использую окончательный RTM MVC 3.

С учетом

Этот маршрут:

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 на Comment на CommentId оно правильно имеет значение 0?

Мне кажется, что связыватель модели по умолчанию привязывается к {id} маршрута.

Ответы [ 4 ]

2 голосов
/ 19 марта 2011

Это происходит потому, что при использовании помощников HTML, таких как HiddenFor, они сначала смотрят данные маршрута и состояние модели, а затем - в модели.Таким образом, они находят в ваших данных маршрута параметр id = 2 и используют это значение вместо id = 0 в модели, которую вы передаете.

1 голос
/ 19 марта 2011

Это ошибка или не может быть из-за ниже реализованной логики;

В Asp.NET MVC движок View использует ViewData (это переменная, и ее тип - "ViewDataDictionary"). И это ViewData имеет 2 свойства «ModelState», которое содержит значения маршрутизации, и «Model», которая содержит наш фактический объект модели.

  1. Механизм просмотра просматривает объект ModelState, получая значение свойства.
  2. Если найдено на шаге 1, вернуть значение.
  3. Иначе объект «Модель» ищет значение свойства.

В вышеприведенном случае у маршрута есть свойство "id", и его значение сохраняется в "ModelState", поэтому оно возвращает значение из "ModelState" вместо привязанной модели.

В приведенном выше сценарии любой элемент управления вводом отображается с неожиданным значением.

Разрешение:

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

//use below jquery function to retrieve data
var postedData = $('.postData');
0 голосов
/ 19 марта 2011

Попробуйте:

Try @Html.Partial("_CommentEditor", new Comment{Id = 0}) 
0 голосов
/ 19 марта 2011

Если вы используете linq to sql, поля, помеченные как предоставленные базой данных, не могут быть установлены вручную.

...