2017-05-30 33 views
0

我正在學習使用ASP.NET和Entity Framework在C#中編寫MVC網站。在ASP.NET視圖中使用Html.DisplayFor的詞典查找

但是,我正在努力編寫一個可以與Html.DisplayFor方法一起使用的字典查找。

說我有以下兩種模式:

public class Dog 
{ 
    public int Id; 
    public string Name; 
    public int BreedId; 
    (...) 
} 

public class Breed 
{ 
    public int Id; 
    public string Name; 
    (...) 
} 

然後,在控制器的地方,我創建一個包含所有品種,由Id索引的字典,並將其分配給ViewBag.Breeds

Dogs/Index視圖,我用類似的東西:

@model IEnumerable<App.Models.Dog> 

<table> 
    @foreach (var item in Model) 
    { 
     <tr> 
      <td> 
       @Html.DisplayFor(modelItem => item.Name) 
      </td> 
      <td> 
       @(ViewBag.Breeds[item.BreedId].Name) 
      </td> 
     </tr> 
    } 
</table> 

及其產生的及其品種的表格,如預期。

但是,如果我嘗試使用Html.DisplayFor方法裏面的詞典查詢,我得到的,因爲表達式樹不能包含一個動態操作錯誤:

@Html.DisplayFor(modelItem => ViewBag.Breeds[item.BreedId].Name) 

它鑄造一個顯式類型的字典也不起作用:

@Html.DisplayFor(modelItem => ((Dictionary<int, Breed>)ViewBag.Breeds)[item.BreedId].Name) 

有沒有辦法讓它工作?

回答

0

你應該檢查出this question,探索爲什麼DisplayFor有這樣一個有趣的語法。它不僅僅是一個接受字符串的簡單函數。它接受一個表達式,它永遠不會執行,但會被解析,所以Razor引擎可以找到模型的屬性及其所有屬性 - 這就是發現腳手架並知道如何渲染模型成員的方式。

底線是 - 你不能只把任何舊的字符串放在DisplayFor。但是再一次,你不需要 - 顯示一個字符串,你不需要它。

選項1

而不是

@Html.DisplayFor(modelItem => ViewBag.Breeds[item.BreedId].Name) 

只需使用

@ViewBag.Breeds[item.BreedId].Name 

,或者如果你的品種名稱可能包含一個<&字符,則可能需要HTML轉義他們,所以用

@Html.Encode(ViewBag.Breeds[item.BreedId].Name) 

選項2

如果你真的想利用DisplayFor和MVC腳手架,所需的計算字段添加到模型本身,並在視圖中清楚地引用它。

public class Dog 
{ 
    public int Id; 
    public string Name; 
    public int BreedId; 

    [Display(Name = "Breed Name")] //Optional scaffolding attributes 
    public string BreedName 
    { 
     get 
     { 
      return ViewBag.Breeds[BreedId].Name; 
     } 
    } 
} 

,並在您的視圖

@Html.DisplayFor(modelItem => item.BreedName)