MVC2 ModelBinder не привязан к свойству 'id' модели - PullRequest
0 голосов
/ 17 марта 2011

У меня есть модель 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 есть представление, содержащее форму для редактирования полей. Действие Controller 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.

Я немного покопался и попросил дядю Гугла найти ответы, но самое близкое исправление, которое я смог получить, - добавить следующее в класс модели:

[Bind(Include="id")]

, который работает нормально, но ТОЛЬКО заполняет свойство 'id', что означает, что мне придется явно указывать каждое свойство, которое будет включено в привязку модели. Очевидно, что это может быть неприятно, тем более что сама модель обладает на много * на 1017 * больше свойств, чем те, которые я показывал выше.

Есть ли другой способ заставить это работать?

Суть в том, что атрибут [Key] как-то связан с этим, но я ничего не смог понять.

Форма имеет скрытый ввод для свойства 'id'.

<%: Html.HiddenFor(model => model.id)%>

Ответы [ 2 ]

1 голос
/ 17 марта 2011

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

0 голосов
/ 17 марта 2011

Я думаю, что нашел решение.

Моя модель также имеет некоторые сложные свойства, которые отображаются на связанные таблицы в моей модели структуры сущностей.Теперь, так как я использую шаблоны Self-Tracking Entities 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 за ваши мысли по этому вопросу.

...