Mam następujący widok wewnątrz mojej aplikacji sieci web mvc asp.net: -
@model IEnumerable<TMS.Models.TMSVirtualMachine>
<td>
@(item.TechnologyBackUpStatu == null ? "None" : item.TechnologyBackUpStatu.Name )
@Html.DisplayFor(model=>item.TechnologyBackUpStatu.Name)
</td>
temu TechnologyBackUpStatus
jest właściwość null nawigacji, co oznacza, że model może nie mieć TechnologyBackUpStatus
, więc obecnie używam dwa sposoby wyświetlania item.TechnologyBackUpStatu.Name )
. ale dlaczego apprach i należy rozważyć; za pomocą DisplayFor
lub usig ? :
i dlaczego onr apprach lepiej jest porównanie do innych?
Dzięki
Odpowiedzi:
2 dla odpowiedzi № 1Za pomocą DisplayFor
umożliwia użycie DataAnnotation, dla celów formatowania np. To lepiej go używać niż surowy @item.TechnologyBackUpStatu.Name
.
Jak Twój właściwość nawigacji jest typu złożonego, można zbudować DisplayTemplate
gdzie wybrać sposób wyświetlania jednostki, jak to:
Szablon: Shared/DisplayTemplates/TechnologyBackUpStatu.cshtml
@model MyNamespace.TechnologyBackUpStatu
@if(Model != null)
{
@Html.DisplayFor(model => model.Name)
}
Następnie w głównym widoku:
@Html.DisplayFor(model => item.TechnologyBackUpStatu)
0 dla odpowiedzi nr 2
Najprostszym sposobem jest po prostu utworzyć inny obiekt, to jedynie Pobiera wartość od "TechnologyBackUpStatu", jeśli ma ona wartość.
Poniżej znajduje się przykład, aby to zrobić, musisz włączyć leniwy ładowanie, również zignorować właściwość w klasy DbContext.
W modelu:
public class TMSVirtualMachine
{
public int? TechnologyBackUpStatuId { get; set; }
public string TechnologyBackUpStatuName
{
get
{
return TechnologyBackUpStatuId.HasValue ?
TechnologyBackUpStatu.Name : "None";
}
}
public virtual TechnologyBackUpStatu TechnologyBackUpStatu { get; set; }
}
W widoku:
@Html.DisplayFor(model=>item.TechnologyBackUpStatuName)
W swojej klasy DbContext
public class YourDbContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<TMSVirtualMachine>().Ignore(n => n.TechnologyBackUpStatuName);
}
}