2013-10-17 70 views
1

我有一個模型,它有幾個常規屬性,如stringsintegers,它也有2 ilist(of string)屬性。DisplayForModel不呈現我的iList(字符串)

我這些看起來像這樣,被稱爲ListOfString.vbhtml做出了DisplayTemplate

@ModelType List(Of String) 
@If Model IsNot nothing And Model.Any Then 
    @<ul> 
     @For i As Integer = 0 To Model.Count 
      @<li>@Html.Raw(Model(i))</li> 
     Next 
    </ul> 
end if 

這是怎樣的性質裝飾:

<UIHint("ListOfString")> 
<Display(Name:="Options", ResourceType:=GetType(WebText))> 
Public Property Options As List(Of String) = New List(Of String) 

然後,在我看來,我打電話@Html.DisplayForModel()。期望我的所有屬性都由默認顯示模板寫出,而我的自定義屬性是列表屬性的列表。

所有不是IList(of string)的屬性都被渲染出來(它很醜,但這是一個單獨的問題)。

我試着在項目庫中的Views/Shared/DisplayTemplates文件夾和Area/Views/controllername/DisplayTemplates文件夾中顯示模板,兩者都不起作用。

列表DO在它們中有值,並且模板沒有被渲染,因爲我把樸素的「hello」放在它們中,它沒有顯示出來。所以這不是模型綁定出錯的情況。

我完全不在我的搖桿期待這個工作?我的印象是這是關於顯示模板和其他東西的偉大之處之一。

+0

你有兩個IList或兩個List? –

+0

要麼,或者,不以任何方式工作。理想情況下,他們會是'Ilist()',但是如果我只用'List'就可以得到它,那我就沒問題。 – Patricia

+0

渲染頁面的結果是什麼?請把它放在一邊。 –

回答

1

我把這個由Denis連接的C# Object Display Template轉換成了Visual Basic。像default object view template一樣,它有一個TemplateDepth檢查,但它被設置爲5而不是1,並且與默認不同,它在metadata.IsComplexType爲true時顯示視圖。

@Code 
    Dim shouldKnow As Func(Of ModelMetadata, Boolean) = 
     Function(metadata) metadata.ShowForDisplay And Not ViewData.TemplateInfo.Visited(metadata) 
End Code 

@If ViewData.TemplateInfo.TemplateDepth > 5 Then 
    If Model = Nothing Then 
     @ViewData.ModelMetadata.NullDisplayText 
    Else 
     @ViewData.ModelMetadata.SimpleDisplayText 
    End If 
Else 
    For Each prop In ViewData.ModelMetadata.Properties.Where(shouldKnow) 
     If prop.HideSurroundingHtml Then 
      @Html.Display(prop.PropertyName) 
     Else 
      @<div class="control-group"> 
       @Code 
        Dim label = Html.Label(prop.PropertyName) 
        If String.IsNullOrEmpty(label.ToHtmlString()) = False Then 
        @<div class="control-label"> 
         @label 
        </div> 
        End If 
       End Code 
       <div class="controls"> 
        @Html.Display(prop.PropertyName) 
       </div> 
      </div> 
     End If 
    Next 
End If 
2

它不起作用,因爲mvc具有Object的默認顯示模板,它只呈現模型的簡單屬性(如string,int等)。您可以通過添加名爲Object.xxx的部分視圖和模型類型的Object到DisplayTemplates文件夾來覆蓋此模板。你可以看看這個模板這裏https://github.com/BrandyFx/ProjectTemplate/blob/master/src/Web/Views/Shared/DisplayTemplates/Object.cshtml

您也可以找到的例子在這裏https://github.com/githubmickey/ASP.NET-Web-Stack/blob/master/src/System.Web.Mvc/Html/DefaultDisplayTemplates.cs默認實現 - 內部靜態字符串ObjectTemplate

+0

啊,我想這是有道理的。非常令人失望的是,它沒有構建它來處理屬性,這些屬性被稱爲用來顯示它們的東西! 小心讓模板在做什麼? – Patricia

0

您仍然可以顯示在您的視圖單獨每個屬性(或奉獻給您的視圖模型DisplayTemplate) :

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

這將使用ListOfString

默認DisplayTemplate的對象不渲染複雜類型的屬性,所以如果你想使用@Html.DisplayForModel,你必須定義一個DisplayTemplate您的視圖模型,其中包括所有單獨的屬性:

@ModelType MyCustomViewModel 
@Html.DisplayFor(model => model.MyStringProp)<br /> 
@Html.DisplayFor(model => model.MyIntProp)<br /> 
@Html.DisplayFor(model => model.Options) 

如果你有很多屬性,你可以使用一些更通用的解決方案,比如Denis的鏈接。

+0

感謝您的回答。我知道我可以做到這一點,如果我手動寫出每個屬性,但我試圖避免這一點。 – Patricia