1

stringsとのようないくつかの通常のプロパティを持つモデルがあり、integers2 つ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」を入れても表示されなかったため、テンプレートはレンダリングされていません。したがって、モデル バインディングがうまくいかないということではありません。

これが機能することを期待して、私は完全に私のロッカーから外れていますか? これは、表示テンプレートなどの優れた点の 1 つであるという印象を受けました。

4

3 に答える 3

1

Denis によってリンクされたこのC# Object Display Templateを Visual Basic に変換しました。デフォルトのオブジェクト ビュー テンプレートと同様にTemplateDepth チェックがありますが、1 ではなく 5 に設定されており、デフォルトとは異なり、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 に答える