Ответ 1
public virtual int Id { get; protected set; }
protected set;
<!--
Это ваша проблема. Вам нужен публичный сеттер, если вы хотите, чтобы привязка модели по умолчанию могла назначать значение.
Я создал строго типизированное представление Razor MVC3 с использованием кода лесов.
Модель представляет собой POCO с базовым типом PersistentEntity
, который определяет свойство, созданное, обновленное и Id.
Id - это int, созданный и обновленный - DateTime.
Я использую Html.HiddenFor
для создания скрытого поля в представлении.
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.Created)
@Html.HiddenFor(model => model.Updated)
На странице скрытый ввод отображается правильно, при этом Id устанавливается в значение.
<input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="Id" name="Id" type="hidden" value="12">
Однако, когда страница отправляется контроллеру [HttpPost]Edit(Model model)
, свойство Id всегда 0. Создано и обновлено правильно заполнены значениями из представления.
Это должно быть 12 в случае примера в этом сообщении. Что происходит не так?
Мне известно, что я могу изменить подпись метода на [HttpPost]Edit(int personID, Person model)
, поскольку personID находится в строке get, однако почему модель не заполняется скрытым полем?
Обновление
Проблема заключалась в том, что установщик на PersistentEntity
был защищен, ASP не смог установить свойство и проглотил его. Изменение этого для общественности решило проблему.
public abstract class PersistentEntity
{
public virtual int Id { get; protected set; }
public virtual DateTime Created { get; set; }
public virtual DateTime Updated { get; set; }
}
public virtual int Id { get; protected set; }
protected set;
<!--
Это ваша проблема. Вам нужен публичный сеттер, если вы хотите, чтобы привязка модели по умолчанию могла назначать значение.