0

我有兩個實體,它們是從MVC5中實體框架的數據優先方法生成的。 以下是模型mvc中參考實體的顯示名稱

public partial class Cuisine 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Dish> Dishes { get; set; } 
} 


public partial class Dish 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int CuisineId { get; set; } 

    public virtual Cuisine Cuisine { get; set; } 
} 

當我展示它顯示如下

enter image description here

的菜,但我想要的列名作爲名稱和菜名,而不是名稱和姓名。 如何做到這一點? 我想顯示爲名稱當顯示菜單列表和烹飪名稱時顯示在菜單列表中。

代碼爲我CSHTML

<table class="table"> 
<tr> 
<th> 
    @Html.DisplayNameFor(model => model.Name) 
</th> 
<th> 
    @Html.DisplayNameFor(model => model.Cuisine.Name) 
</th> 
<th></th> 
</tr> 
@foreach (var item in Model) { 
<tr> 
<td> 
    @Html.DisplayFor(modelItem => item.Name) 
</td> 
<td> 
    @Html.DisplayFor(modelItem => item.Cuisine.Name) 
</td> 
<td> 
    @Html.ActionLink("Edit", "Edit", new { id=item.Id }) | 
    @Html.ActionLink("Details", "Details", new { id=item.Id }) | 
    @Html.ActionLink("Delete", "Delete", new { id=item.Id }) 
</td> 
</tr> 
} 
</table> 
+0

爲表格添加CSHTML代碼的問題,請。 –

+0

使用只包含2個屬性的視圖模型,並添加一個'[Display(Name =「Cuisine Name」)]'屬性 –

+0

Hi Vadim Martynov,我添加了cshtml代碼。 – aditya

回答

3

它可能會使用一個視圖模型,它彙集只是你需要爲你查看屬性是個好主意。

public class DishVm 
{ 
     public int Id { get; set; } 

     [Display(Name="Cuisine Name")] 
     public string Name { get; set; } 

     [Display(Name="Name")] 
     public string DishName { get; set; } 
} 

我不知道你是如何檢索您的數據,但它看起來與此類似:

IEnumerable<DishVm> vm = context.Dishes 
           .Include(c => c.Cuisines) 
           .OrderBy(n => n.Name) 
           .Select(x => new DisVm { 
            Name = x.Cuisine.Name, 
            DishName = x.Name 
           }); 

return View(vm); 

那麼你的觀點將有一個新的模式類型:@model IEnumerable<Yournamespace.Folder.DishVm>

+0

但是這樣我必須複製我所有的驗證。我的其他領域有幾個驗證。另外,我懷疑如果我們創建ViewModel,我們會丟失導航屬性(如果我錯了,請糾正我)。除了使用ViewModel之外,還有其他方法嗎? – aditya

+0

@aditya,您不重複任何驗證。 '[Display]'屬性是特定於視圖的屬性,不應該在數據模型中。使用視圖模型是正確的方法 –

+0

所以,如果我有10個其他字段,並且每個都有一些驗證(如電子郵件驗證),我的模型(Dish)中的一些正則表達式驗證,我是否應該在視圖模型中編寫所有這些驗證?如果是的話,我正在複製作品的權利? – aditya

2

你可以使用DataAnnotation

public partial class Cuisine 
{ 
    public int Id { get; set; } 

    [Display(Name="Name of Cuisine")] 
    public string Name { get; set; } 

    public virtual ICollection<Dish> Dishes { get; set; } 
} 

EDI T:

您已使用@Html.DisplayNameFor(model => model.Cuisine.Name)顯示菜餚的名稱。您可以使用LabelFor()而不是DisplayNameFor來顯示名稱。改變CSHTML並使用

@Html.LabelFor(model => model.Cuisine.Name, "Cuisine Name") 
+0

但在我的美食視圖中,我只想將其作爲'名稱',並在菜餚視圖中將其作爲'料理名稱'。添加數據註釋更改名稱無處不在 – aditya

+0

嗨,感謝LabelFor屬性。但是當我引用model.Cuisine時出現錯誤,如上面的語法。它顯示了model.Cuisine不存在於模型中。我沒有在DisplayNameFor()屬性中收到任何錯誤。這很混亂。你能解釋爲什麼會發生這種情況嗎? – aditya

+0

使用'LabelFor()'不合適 - 它會創建一個'

0

在您的虛擬財產的頂部,具有裝飾它[顯示(名稱=「料理」]

然後在您的視圖 - >頭,刪除請將.Name在。end所以它說: @ Html.DisplayNameFor(型號=> model.Cuisine)

就這麼簡單:)