[英]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。
假设您有一个商店控制器。 这将是您要创建的文件结构。
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.