2011-04-18 95 views
20

我的視圖模型中有幾個屬性是僅顯示的,但我需要使用jQuery檢索它們的值以在頁面上執行計算。標準Html.DisplayFor()方法只是將它們的值寫入頁面。我想創建一個模板,剃鬚刀,讓我來呈現每個元素:如何爲DisplayFor()創建MVC Razor模板

<span id="ElementsId">Element's value</span> 

我知道我可以在Html.DisplayFor()指定模板使用特定模板渲染屬性,但內該模板如何識別id屬性,以寫入範圍標記?

@Html.DisplayFor(model => model.Element, "MyTemplate"); 

回答

45

OK,我發現它,它實際上是非常簡單的。在我視圖\共享\ DisplayTemplates文件夾我有一個包含Reading.cshtml如下:

@model System.Int32 
<span id="@ViewData.ModelMetadata.PropertyName">@Model</span> 

這使得使用屬性爲ID屬性的名稱和值了正確的標籤屬性作爲內容:

<span id="Reading">1234</span> 

在視圖文件此可以使用以下被稱爲

或者如果模型屬性裝飾有UIHint(「讀書」)然後模板名稱可以被排除在呼叫到DisplayFor(),它仍然會渲染使用模板:

@Html.DisplayFor(model => model.Reading) 

這應該與自定義編輯器模板同樣適用。

+0

那麼你如何處理'System.Int32?'(Nullable int)。您無法創建另一個名爲'Int32?.cshtml'的視圖。 – 2013-08-29 02:41:35

+0

該視圖稱爲Reading.cshtml,不是Int32.cshtml。所以如果你有一個'Int32?'屬性,你可以使用'@model System.Int32?'創建一個新文件'WhateverPropertyIsCalled.cshtml'。免責聲明:我不記得自己有這個要求,我沒有測試過這個工作。 – 2013-09-05 21:33:41

+3

我真的測試過了,如果你用'System.Int32?'的模型創建了一個名爲'Int32.cshtml'的文件,你將會覆蓋默認的模板,並且它會被int32的兩個版本(可以爲null並且不可爲空) )。 – 2013-09-08 06:09:21

7

你可以使視圖模型的這部分id和顯示器模板中使用它:

<span id="@Model.Id">@Html.DisplayFor(x => x.Value)</span> 
1

我和原帖有完全一樣的問題。

不確定最後一條評論是否有效。它會使HTML id屬性成爲運行時值,因此不能使用設計時間名稱進行引用。

我用DisplayFor的過載,它允許您添加新對象到數據字典(ViewBag)

我的模型是所謂的項目具有各種性能的一個C#對象。在我看來,我有這樣的:

@Html.DisplayFor(model => model.ProjectName, "StringDisplaySetHtmlID", new { HtmlID = "project-name" }) 

這是使用所謂的StringDisplaySetHtmlID最後一個參數自定義模板添加一個鍵值對的Viewbag。

我的模板文件看起來像這樣:

@model string 
<span class = "display-field" id = "@(ViewBag.HtmlID)">@Model</span> 

我還設置一類這裏造型的目的。我已經使用密鑰名稱HtmlID而不僅僅是ID來避免潛在的常見命名衝突。

現在,在我的javascript我使用jquery的下面可以拿起跨度的內容:

var projectName = $('#project-name').text() 
2

an article解釋Templates(顯示器+編輯器)的剃刀,也是UIHint屬性。