/ / Melhor maneira de lidar com propriedades de navegação com capacidade nula na minha opinião - asp.net-mvc, asp.net-mvc-4, razor

Melhor maneira de lidar com propriedades de navegação nulas na minha opinião - asp.net-mvc, asp.net-mvc-4, razor

Eu tenho a seguinte exibição dentro do meu aplicativo da web asp.net mvc: -

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

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

a TechnologyBackUpStatus é uma propriedade de navegação NullAble, o que significa que o modelo pode não ter um TechnologyBackUpStatus, então atualmente estou usando duas maneiras de exibir o item.TechnologyBackUpStatu.Name ) . mas por que motivo devo considerar; usando o DisplayFor ou use o ? : e por que onr apprach é melhor comparado ao outro?

obrigado

Respostas:

2 para resposta № 1

Usando DisplayFor permite o uso de DataAnnotation, para fins de formatação, por exemplo. É melhor usá-lo do que um cru @item.TechnologyBackUpStatu.Name.

Como sua propriedade de navegação é um tipo complexo, você pode criar um DisplayTemplate onde você escolhe como exibir sua entidade, assim:

Seu modelo: Shared/DisplayTemplates/TechnologyBackUpStatu.cshtml

@model MyNamespace.TechnologyBackUpStatu

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

Então, na sua visualização principal:

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

0 para resposta № 2

A maneira mais simples é você criar outra propriedade, ela só obtém o valor de "TechnologyBackUpStatu" se tiver um valor.

Abaixo está um exemplo, para fazer isso, você precisa ativar o Lazy Loading, também ignore a propriedade na sua classe DbContext.

No seu modelo:

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

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

Na sua opinião:

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

Na sua classe DbContext

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