在我的视图上处理Null-able导航属性的最佳方法

时间:2013-11-20 10:14:03

标签: asp.net-mvc asp.net-mvc-4 razor

我在asp.net mvc web应用程序中有以下视图: -

        @model IEnumerable<TMS.Models.TMSVirtualMachine>
        <td>
@(item.TechnologyBackUpStatu == null ? "None" : item.TechnologyBackUpStatu.Name )        

@Html.DisplayFor(model=>item.TechnologyBackUpStatu.Name)
        </td>

TechnologyBackUpStatus是一个NullAble导航属性,这意味着模型可能没有TechnologyBackUpStatus,因此目前我使用两种方式显示item.TechnologyBackUpStatu.Name )。但为什么我应该考虑评价;使用DisplayFor或使用? :和为什么onr apprach比其他更好?

由于

2 个答案:

答案 0 :(得分:2)

使用DisplayFor允许使用DataAnnotation,例如用于格式化目的。使用它比使用原始@item.TechnologyBackUpStatu.Name更好。

由于您的导航属性是一种复杂类型,因此您可以构建一个DisplayTemplate,在其中选择如何显示您的实体,如下所示:

您的模板:Shared/DisplayTemplates/TechnologyBackUpStatu.cshtml

@model MyNamespace.TechnologyBackUpStatu

@if(Model != null)
{
    @Html.DisplayFor(model => model.Name)
}

然后,在您的主视图中:

@Html.DisplayFor(model => item.TechnologyBackUpStatu)

答案 1 :(得分:0)

最简单的方法是创建另一个属性,如果它有值,它只从“TechnologyBackUpStatu”中获取值。

下面是一个示例,为此,您需要启用延迟加载,同时忽略DbContext类中的属性。

在您的模型中:

public class TMSVirtualMachine
 {
     public int? TechnologyBackUpStatuId { get; set; }

     public string TechnologyBackUpStatuName
     {
         get
         {
             return TechnologyBackUpStatuId.HasValue ? 
                        TechnologyBackUpStatu.Name : "None";
         }
     }
     public virtual TechnologyBackUpStatu TechnologyBackUpStatu { get; set; }
 }

在您看来:

@Html.DisplayFor(model=>item.TechnologyBackUpStatuName)

在您的DbContext课程中

public class YourDbContext : DbContext
{
  protected override void OnModelCreating(DbModelBuilder modelBuilder)
   {
      modelBuilder.Entity<TMSVirtualMachine>().Ignore(n => n.TechnologyBackUpStatuName);
   }
}