C# 为.NETMVC中处理的ObjectContext设计回退的最佳方法是什么
我试图在我的视图中显示一个对象的属性(如果它存在),否则返回默认值,例如C# 为.NETMVC中处理的ObjectContext设计回退的最佳方法是什么,c#,asp.net-mvc,entity-framework,razor,C#,Asp.net Mvc,Entity Framework,Razor,我试图在我的视图中显示一个对象的属性(如果它存在),否则返回默认值,例如 @if(Product.Description != null && Product.Description.Color != null){ <li>@Product.Description.Color</li> } @if(Product.Description!=null&&Product.Description.Color!=null){ @产品描述颜色 } 问题是
@if(Product.Description != null && Product.Description.Color != null){
<li>@Product.Description.Color</li>
}
@if(Product.Description!=null&&Product.Description.Color!=null){
@产品描述颜色
}
问题是,如果我在视图中执行null检查,则ObjectContext已为Product.Description(如果它不存在)释放,并引发异常
我应该在控制器中指定一个默认值/回退,还是有办法在视图中处理这个问题?永远不要向视图发送“活动”对象。如果这样做,您将有效地混合UI和数据层。请记住,在渲染视图时,控制器已完成执行
而是发送一份副本,其中包含您需要在视图中使用的属性
我知道有些书建议在MVC中的“M”代表“DomainModel”,他们建议这应该是实体框架实体的一个实例。我不同意,我觉得这是一种责任
我很幸运地使用了“”工具,它使从EF实体的属性和视图中使用的模型(ViewModel)的属性进行映射变得非常简单。正如John在评论中提到的,以下内容通常不受欢迎:
public ActionResult Index()
{
var db = new MyDbContext();
var model = db.Products.FirstOrDefault();
return View(model);
}
相反,请在将值映射到视图模型时正确处理上下文:
现在视图本身并没有真正实现逻辑:
@if(product.HasDescription && product.Description.HasColor){
<li>@Product.Description.Color</li>
}
@if(product.hasscription&&product.Description.HasColor){
@产品描述颜色
}
永远不要向视图发送“活动”对象。如果这样做,您将有效地混合UI和数据层。发送一份副本,其中包含您需要在视图中使用的属性。将模型映射到视图模型;并使用合理的默认值在ViewModel中执行空检查:public bool hascaolor(){Product.Description!=null&&Product.Description.Color!=null}
属性:ProductDescriptionColor{get;set;}
您是对的,它不应该这样。Automapper有助于从这些ORM模型对象轻松创建到DTO的映射,这些对象有很多悬而未决的部分。这样做的最佳方法是将我需要显示的所有内容都放在ViewBag中吗?@user2865446否。将其放在ViewModel中。Viewbag也不是一个好地方。不,创建一个单独的类(ViewModel),其中只包含视图中需要的属性。在控制器中,从EF对象映射到ViewModel。在视图中使用ViewModel。@JohnSaunders您是否有任何资源来获取更多类似于此的最佳实践MVC内容,也许还有如何设置项目的文件结构等。我的代码从未被审阅过,通常是单独开发的,因此很容易犯类似的错误。我想我已经按照您的意图编辑了它,但请检查我。
@if(product.HasDescription && product.Description.HasColor){
<li>@Product.Description.Color</li>
}