我有一个模型,它有一些常规属性,如strings
和integers
,它还有2个ilist(of string)
属性。
我为这些看起来像这样的DisplayTemplate
做了ListOfString.vbhtml
:
@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 :(得分: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
答案 1 :(得分: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 :(得分:0)
您仍然可以在视图中单独显示每个属性(或专用于视图模型的DisplayTemplate):
@Html.DisplayFor(model => model.Options)
这将使用ListOfString
。
Object的默认DisplayTemplate不呈现复杂的类型属性,因此如果要使用@Html.DisplayForModel
,则必须为视图模型定义DisplayTemplate,包括所有属性:
@ModelType MyCustomViewModel
@Html.DisplayFor(model => model.MyStringProp)<br />
@Html.DisplayFor(model => model.MyIntProp)<br />
@Html.DisplayFor(model => model.Options)
如果您有很多属性,可以使用一些更通用的解决方案,例如Denis的链接。