带有EF 6模型更新问题的ASP.NET MVC4

时间:2014-04-24 19:15:46

标签: c# asp.net-mvc entity-framework

我有两个模型如下

public class Category
{
     [Key]
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
     public int ID { get; set; },
     [Required]
     public string category { get; set; }
     [Required]
     public string Desc { get; set; }
}
public class Product
{
     [Key]
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
     public int ID { get; set; },
     public int CatID { get; set; },
     [ForeignKey("CatID")]
     public virtual Category Category { get; set; },
     [Required]
     public string Desc { get; set; },
     public string DisplayName
     {
         get
         {
             return string.format("{0} - {1}",this.Category.category,this.Desc);
         }
     }
}

这是我的编辑行动

public ActionResult Edit(int id)
{
     ViewBag.PossibleCategories = categoryRepository.All;
     return View(productRepository.Find(id));
}
[HttpPost]
public ActionResult Edit(Product product)
{
     if (ModelState.IsValid)  //<== This becomes false saying category.desc is required
     {
          productRepository.InsertOrUpdate(product);
          productRepository.Save();          
          return RedirectToAction("Index");
     }
     else
     {
          ViewBag.PossibleCategories = categoryRepository.All;
          return View();
     }
}

我有一个脚手架的产品编辑视图,它显示ID和DisplayName为Readonly。所有其他字段都是可编辑的。

编辑视图还有产品 - &gt;类别 - &gt; category有一个只读文本字段

@Html.TextBoxFor(model => model.Category.category, new Dictionary<string, object>() { { "readonly", "true" } })

回发后发送此内容并尝试创建新类别。这不是必需的。类别链接将使用product.CatID。

继续

如何显示这些类型的字段??

<击> 当编辑视图回发模型状态显示为无效时,因为产品的类别的desc为null(product - &gt; category - &gt; desc)。 如果我在Product中注释掉DisplayName属性,则不会发生此问题。

根据我的理解,这是因为DiaplayName属性引用了Category属性,而视图视图没有category.desc字段,所以当在POST操作上创建模型时,不会填充desc。将category.desc字段添加到视图是解决此问题的一种方法。 有没有其他方法可以解决这个问题?

注意:这不是我遇到此问题的唯一模型。有许多具有相同问题的复杂模型,对于我而言,这些字段也包括在视图中会使(1)一个非常混乱的视图(2)使得往返的数据量很高。

1 个答案:

答案 0 :(得分:0)

简单解决方案

检查是否为空。真的,你应该养成这个习惯。

 public string DisplayName
 {
     get
     {
         if(this.Category != null)
         {
             return string.format("{0} - {1}",this.Category.category,this.Desc);
         }
         else
         {
             return String.Empty;
         }
     }
 }

复杂解决方案

不是直接在Views中使用数据库模型,另一种解决方案是创建ViewModels。这些是专门针对您的View的模型。作为一个简化示例,让我们采用您的产品模型并创建一个ViewModel。

  1. 为ViewModels创建一个文件夹
  2. 创建与您的Controller匹配的ViewModel文件
  3. 创建您将在视图中使用的ViewModel
  4. 假设你有一个商店控制器。这将是您要创建的文件结构。

    Models
        ViewModels
            StoreViewModels.cs
    

    在StoreViewModels中,您将创建一个名为ProductViewModel的ViewModel,您可以使用Product中的信息填充该视图。

    public class ProductViewModel
    {
        public int ID { get; set; }
        public string Description { get; set; }
        public string DisplayName { get; set; }
    
        public ProductViewModel() { }
        public ProductViewModel(Product product)
        {
            this.ID = product.ID;
            this.Description = product.Description;
            this.DisplayName = product.DisplayName;
        }
    }
    

    在您的视图中,您引用ProductViewModel而不是Product。然后在接收端将ViewModel字段转换回模型。如果您有任何问题,请告诉我。