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>
    }