1

我有一个模型,它有一些常规属性,比如stringsand 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但均无效。

列表中确实有值,并且模板没有被呈现,因为我在其中放置了简单的“hello”并且它没有显示出来。所以这不是模型绑定出错的情况。

我完全不希望这能奏效吗?我的印象是,这是关于显示模板之类的伟大事情之一。

4

3 回答 3

2

它不起作用,因为 mvc 具有 Object 的默认显示模板,它仅呈现模型的简单属性(如字符串、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

于 2013-10-21T21:07:26.863 回答
1

我将这个由 Denis 链接的C# 对象显示模板转换为 Visual Basic。与默认对象视图模板一样,它有一个 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
于 2013-10-25T15:01:54.977 回答
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 的链接。

于 2013-10-23T14:25:40.310 回答