如何使用MVC2 RC2进行更新

时间:2010-03-04 05:23:23

标签: asp.net-mvc updatemodel

我正在尝试编辑记录。我有默认路线 当我单击提交按钮时,我在UpdateModel行上得到一个例外:
无法更新“MyProject.Mvc.Models.Product”类型的模型。
在页面上,ProductId字段的验证提示值无效:
值“9”无效。 9是我要编辑的记录的ID。 可能出现什么问题?

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);

然后不会抛出异常,数据也不会在数据库中更新。

[编辑]

我正在使用实体框架

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;
      }
  }
}

3 个答案:

答案 0 :(得分:0)

你可以发布你的模型源代码吗?模型是否包含要更新的类的字段,或者仅将此类作为对象(产品)? 问题可能存在,因为当你的模型有对象Product时,你应该使用类的名称传递给UpdateModel方法前缀...

答案 1 :(得分:0)

UpdateModel(product, "Product");的问题在于您使用与Product类名称相同的前缀(Product)。尝试使用不同的前缀。为此,您可能需要重命名Product类的ProductFormViewModel属性。

答案 2 :(得分:0)

您需要编辑ID吗?如果ID是表中产品的PK,则可能是绑定问题。 尝试

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