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 }
);

И на странице сообщения, например, блог/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} маршрута.

Это было полезно?

Решение

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

Другие советы

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

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

  1. Двигатель View смотрит на объект «модели», получающий ценность свойства.
  2. Если найдено на шаге 1, то возвращает значение.
  3. Весе смотрит в объект «модели», чтобы получить значение для свойства.

В вышеприведенном случае маршрут имеет свойство «ID», а его значение сохраняется в «модели», поэтому он возвращает значение из «модели» вместо модели BENG.

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

Резолюция:

<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