У меня есть модель Project, которая имеет следующие свойства (для краткости упрощено).
[DataContract(IsReference = true)]
public class Project
{
[Key]
[DataMember]
public int id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public DateTime CreatedDate { get; set; }
}
Модель также является контрактом данных для службы WCF, которая использует Entity Framework 4 для запроса хранилища данных. Код для модели создается из шаблона, который автоматически создает уровень службы CRUD для модели Entity Framework.
Теперь в моем приложении MVC2 есть представление, содержащее форму для редактирования полей. Действие Edit контроллеров принимает всю модель в качестве аргумента при POST.
[HttpPost]
public ActionResult Edit(Project project)
{
var context = new ServiceContext();
try
{
if (ModelState.IsValid)
{
project = context.UpdateProject(project);
return RedirectToAction("Index");
}
}
catch
{
ModelState.AddModelError("", "Could not save project");
}
return View(project);
}
Теперь моя проблема в том, что когда форма отправляется в контроллер, все поля модели Project правильно заполнены кроме для свойства id, которое по умолчанию равно 0.
Я покопался и умолял дядю Google дать ответы, но самое близкое решение, которое я смог получить, - это добавить в класс модели следующее:
[Bind(Include="id")]
который работает нормально, но ТОЛЬКО заполняет свойство id, а это означает, что мне придется явно указать каждое свойство, которое будет включено в привязку модели. Очевидно, это может быть неприятно, особенно если учесть, что сама модель имеет на намного больше свойств, чем та, которую я показал выше.
Есть ли другой способ заставить это работать?
По ощущениям, атрибут [Key] имеет к этому какое-то отношение, но я не смог ничего понять.
В форме есть скрытый ввод для свойства id.
<%: Html.HiddenFor(model => model.id)%>