我试图在我的视图中显示对象的属性(如果存在),否则会回退到默认值,例如。
@if(Product.Description != null && Product.Description.Color != null){
<li>@Product.Description.Color</li>
}
这个问题是,如果我在视图中进行空检查,那么如果它没有存在且抛出异常,则会为Product.Description处理ObjectContext。
我应该在控制器中指定默认值/后退还是有办法在视图中处理此问题?
答案 0 :(得分:7)
不要向视图发送“实时”对象。如果您这样做,则可以有效地混合UI和数据层。请记住,控制器在渲染视图时已完成执行。
而是发送一份副本,其中包含您需要在视图中使用的属性。
我知道有些书认为 M VC中的“M”代表“Domain M odel”,他们认为这应该是一个实例,实例,实体框架实体。我不同意,并认为这是责任。
我很幸运使用了“AutoMapper”工具,这使得从EF实体的属性和您在视图中使用的模型(ViewModel)的属性进行映射变得很简单。
答案 1 :(得分:4)
正如约翰在评论中提到的,以下内容通常不赞成:
public ActionResult Index()
{
var db = new MyDbContext();
var model = db.Products.FirstOrDefault();
return View(model);
}
相反,在将值映射到视图模型时正确处理上下文:
public ActionResult Index()
{
var model = new IndexVM();
using (var db = new MyDbContext())
{
// Assuming EF
var dbProduct = db.Products.FirstOrDefault();
// Even better performance:
var dbProduct = db.Products
// prevent lazy loading
.Include(p => p.Description.Color)
.FirstOrDefault()
// prevent ef tracking with proxy objects
.AsNoTracking();
// can be automated with AutoMapper or other .Net Components
ProductVM productVM = new ProductVM();
productVM.Id = dbProduct.Id;
// etc
// Don't put logic in View:
productVM.HasDescription = (product.Description != null);
if (productVM.HasDescription)
{
var descriptionVM = new DescriptionVM();
// map values
productVM.Description = descriptionVM;
}
model.Product = productVM;
}
return View(model);
}
现在视图并没有真正做到逻辑本身:
@if(product.HasDescription && product.Description.HasColor){
<li>@Product.Description.Color</li>
}