我有两个模型如下
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)使得往返的数据量很高。
答案 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。
假设你有一个商店控制器。这将是您要创建的文件结构。
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字段转换回模型。如果您有任何问题,请告诉我。