2009-09-23 2 views
0

У меня есть таблица с GUID первичным ключом, в который я пытаюсь вставить вновь созданный объект, используя метод UpdateModel ASP.NET MVC давал Контролер (дб контекст LINQ к SQL данных):Как я могу получить UpdateModel ASP.NET MVC для игнорирования первичного ключа?

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(FormCollection collection) 
    { 
     Fields field = new Fields(); 
     field.ID = Guid.NewGuid(); 

     try 
     { 
      UpdateModel(field); 

      db.Fields.InsertOnSubmit(field); 
      db.SubmitChanges(); 

      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View("Edit", field); 
     } 
    } 

Во-первых, кажется странным, что автогенерированные представления для редактирования и создания на модели будут включать в себя поле первичного ключа для редактирования пользователем, но их достаточно просто удалить.

Но я столкнулся с проблемой, когда вызов UpdateModel вызывает исключение, когда первичный ключ не передается как часть коллекции форм.

Я пропустил какой-то способ пометить столбец первичного ключа как что-то, что пользователь (а по расширению, вызов UpdateModel) не должен сбрасывать? Я мог бы добавить массив includeProperties и оставить имя первичного ключа, но это не очень СУХОЙ).

Я также мог бы добавить скрытое поле в мою форму с использованием первичного ключа - с помощью первичного ключа GUID. Я могу сделать это в запросе GET для создания.

ответ

0

Прежде всего: свойство с первичным ключом должно быть доступно только для чтения.

Вы также можете использовать свой собственный класс BindModel.

3

Не используйте UpdateModel, если вы не обновление модель объекта. В этом случае вы находитесь , создавая ... у ScottGu есть несколько хороших примеров в this blog post.

Если вам нужен более простой способ привязки данных, ASP.NET MVC автоматически выполнит большую работу для вас, если вы используете правильные соглашения об именах. Например, форма с полями ввода «Имя», «LastName» и «BirthDate» может послать свои данные к способу действия со следующей подписью:

public ActionResult Create(string firstName, string lastName, DateTime birthDate) 

и параметры будут заполнены значениями формы , Обратите внимание, что тип данных не должен быть строкой - на самом деле вы можете даже привязываться к своим собственным классам. Если у вас есть этот класс ...

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime Birthdate { get; set; } 
} 

... и форма с полями ввода «person_FirstName», «person_LastName» и «person_BirthDate» вы можете привязать его к новому объекту Person сразу:

public ActionResult Create(Person person) { ... } 

Ницца, да? =)