DisplayForModel没有渲染我的iList(字符串)

时间:2013-10-17 12:55:07

标签: asp.net asp.net-mvc vb.net asp.net-mvc-4 display-templates

我有一个模型,它有一些常规属性,如stringsintegers,它还有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”并且没有显示。所以不是模型绑定出错的情况。

我是否完全不喜欢摇杆,期待这个工作?我的印象是,这是显示模板和诸如此类的伟大事物之一。

3 个答案:

答案 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的链接。