MVC3 Html.HiddenFor(Model => Model.Id), не возвращаясь к контроллеру

Я создал строго типизированное представление 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. Создано и обновлено правильно заполнены значениями из представления.

enter image description here

Это должно быть 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; }
}

Ответы

Ответ 1

public virtual int Id { get; protected set; }

protected set; <!-- Это ваша проблема. Вам нужен публичный сеттер, если вы хотите, чтобы привязка модели по умолчанию могла назначать значение.