繁体   English   中英

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

[英]ASP.NET MVC4 with EF 6 Model Update Issue

我有以下两种型号

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为“只读”。 所有其他字段都是可编辑的。

编辑视图还具有产品->类别->类别具有只读文本字段

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

回发发送此邮件并尝试创建一个新类别。 这不是必需的。 类别链接将使用product.CatID结转。

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

当“编辑”视图的“回发模型”状态由于产品类别的desc为空(产品->类别-> desc)而显示为无效。 如果我注释掉Product中的DisplayName属性,则不会发生此问题。

以我的理解,这是因为DiaplayName属性引用Category属性,并且视图视图没有category.desc字段,因此当在POST操作上重新创建模型时,不会填充desc。 向视图添加category.desc字段是解决此问题的一种方法。 还有其他解决方法吗?

注意:这不是我遇到此问题的唯一模型。 有许多具有相同问题的复杂模型,对我来说,视图中也包含这些字段将使(1)非常混乱的视图(2)进行往返的数据量很大。

简单的解决方案

检查是否为空。 真的,无论如何,您应该养成这种习惯。

 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设计的模型。 作为简化示例,让我们采用您的Product模型并创建一个ViewModel。

  1. 为您的ViewModels创建一个文件夹
  2. 创建与您的控制器匹配的ViewModel文件
  3. 创建一个将在视图中使用的ViewModel

假设您有一个商店控制器。 这将是您要创建的文件结构。

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字段转换回Model。 如果您有任何疑问,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM