MVC2 ModelBinder не привязан к свойству id модели

У меня есть модель 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)%>

person tobias86    schedule 17.03.2011    source источник


Ответы (2)


Попробуйте добавить дополнительное скрытое поле для идентификатора, например ‹%: Html.HiddenFor (model => model.Id)%>

person swapneel    schedule 17.03.2011
comment
Спасибо, это уже скрытое поле в форме (забыл показать его в моем исходном вопросе). Все еще не работает ... - person tobias86; 17.03.2011
comment
удалив атрибут [Key] - делает ли идентификатор сообщения mvc в viewmodel - person swapneel; 17.03.2011
comment
Нет, это не так. Но это поставило меня на верный путь. Спасибо! Мой ответ ниже - person tobias86; 17.03.2011

Думаю, я нашел решение.

Моя модель также имеет некоторые сложные свойства, которые сопоставляются со связанными таблицами в моей модели структуры сущностей. Теперь, когда я использую шаблоны T4 для самопроверки сущностей для создания уровня обслуживания, у него есть дополнительная логика, когда дело доходит до сопоставления значений с сущностями. В этом случае одним из сложных свойств является класс Status, который выглядит так:

public class Status
{
    public int ProjectId { get; set; }
    public int StatusId { get; set ; }
}

ProjectId - это внешний ключ к таблице Project в моем хранилище данных. Я заметил, что поле ProjectId также было установлено на 0 во время привязки модели.

Когда я добавил следующее к своему обзору

<%: Html.HiddenFor(model => model.Status.ProjectId) %>

в оба поля было отправлено правильное значение в контроллер.

Проблема решена :)

Благодарим swapneel за ваши мысли по этому поводу.

person tobias86    schedule 17.03.2011