2010-03-04 2 views
2

Я пытаюсь отредактировать запись. У меня есть маршрут по умолчанию.
Когда я нажимаю кнопку отправки, я получаю исключение в строке UpdateModel:
Модель типа «MyProject.Mvc.Models.Product» не может быть обновлена.
На странице проверка поля ProductId вызывает недопустимое значение:
Значение «9» недействительно. 9 является идентификатором записи, которую я пытаюсь отредактировать. Что может быть неправильным?Как обновить с помощью MVC2 RC2

public ActionResult Edit(int id) 
{ 
    Product product = productRepository.GetProduct(id); 

    return View(new ProductFormViewModel(product)); 
} 

[HttpPost] 
public ActionResult Edit(int id, FormCollection productFormViewModel) 
{ 
    Product product = productRepository.GetProduct(id); 
    try 
    { 
    // TODO: Add update logic here 
    UpdateModel(product, "Product"); 
    productRepository.Save(); 
    return RedirectToAction("Index"); 
    } 
    catch (Exception ex) 
    { 
     return View(new ProductFormViewModel(product)); 
    } 
} 

Если изменить модель обновления линию:

UpdateModel(product); 

то исключение не выбрасывается, а данные не обновляется в базе данных.

[Редактировать]

Я использую Entity Framework

namespace MyProject.Mvc.Models 
{ 
    [MetadataType(typeof(ProductMetaData))] 
    public partial class Product 
    { 
     public Product() 
     { 
      // Initialize Product 
      this.CreateDate = System.DateTime.Now; 
     } 
    } 

    public class ProductMetaData 
    { 
     [Required(ErrorMessage = "Product name is required")] 
     [StringLength(50, ErrorMessage = "Product name must be under 50 characters")] 
     public object ProductName { get; set; } 

     [Required(ErrorMessage = "Description is required")] 
     public object Description { get; set; } 
    } 

    public class ProductFormViewModel 
    { 
     public Product Product { get; private set; } 

     public ProductFormViewModel() 
     { 
      Product = new Product(); 
     } 

     public ProductFormViewModel(Product product) 
     { 
      Product = product; 
     } 
    } 
} 
+0

Я использую NerdDinner в качестве проводника. – Picflight

+0

Проблема заключается в редактировании вида, <% @ Page Title = "" Language = "C#" MasterPageFile = "~/Views/Shared/Site.Master" Inherits = "System.Web.Mvc.ViewPage "%> Если я пройду в модели View ModelFormViewModel, она не обновляется, но если я изменю ее на <% @ Page Title =" "Язык =" C# "MasterPageFile =" ~/Views/Shared/Site.Master "Inherits =" System.Web.Mvc.ViewPage "%> обновляется. – Picflight

ответ

0

Вам нужно отредактировать ID? если идентификатор является PK продукта в вашей таблице, то это может быть проблемой, связанной с обязательным требованием. Пробег

[MetadataType(typeof(ProductMetaData))] 
[Bind(Exclude="ID")] 
public partial class Product 
{ 
    public Product() 
    { 
     // Initialize Product 
     this.CreateDate = System.DateTime.Now; 
    } 
} 
+0

Я удалил идентификатор из представления, так как мне не нужно связывать его, но модель еще не обновляется. Я использовал тот же код в MVC 1, и он обновляется. Я думаю, что проблема заключается в MVC 2. Возможно, существует другой способ обновления. Я смотрю NerdDinner, и последний ND имеет код MVC 2, но в моем проекте модель не обновляет – Picflight

+0

@Picflight - Не имеет значения, нет ли идентификатора в представлении. ModelBinder привязывает его в любом случае, если вы явно не исключили его с атрибутом Bind. Почему бы вам не попытаться исключить его, как показано выше, и посмотреть, что произойдет? –

+0

Ник, я пробовал, как вы упомянули, и я получаю такое же поведение. Если я изменю директиву «Редактировать вид страницы» на Inherits = «System.Web.Mvc.ViewPage » на Inherits = «System.Web.Mvc.ViewPage " затем обновляется модель. – Picflight

0

могли бы вы опубликовать модель исходный код? У модели есть поля класса, которые вы хотите обновить, или просто этот класс как объект (Продукт)? проблема может существует becouse, когда ваша модель имеет объектный продукт, вы должны перейти к методу UpdateModel префикс с именем класса ...

0

Проблема UpdateModel(product, "Product"); в том, что вы используете один и тот же префикс (Product) как Product имя класса. Попробуйте использовать другой префикс. Для этого вам может потребоваться переименовать свойство Product класса ProductFormViewModel.

+0

Я пробовал это, не работает. Я получаю такое же поведение. – Picflight

Смежные вопросы