如何制作需要通用表达式的可重用剃刀视图?

时间:2014-11-07 17:48:24

标签: asp.net-mvc razor

MVC模板生成显示每个字段的视图:

    <div class="form-group">
        @Html.LabelFor(Function(model) model.Name, htmlAttributes:=New With {.class = "control-label col-md-2"})
        <div class="col-md-10">
            @Html.EditorFor(Function(model) model.Name, New With { .htmlAttributes = New With { .class = "form-control" } })
            @Html.ValidationMessageFor(Function(model) model.Name, "", New With { .class = "text-danger" })
        </div>
    </div>

每个属性都有一个 - 只有属性名称更改 - 以及每种类型实体的一组属性。我想将其置于可重用的局部视图中,但问题是表达式取决于模型类型,并且您不能拥有通用视图。所以我在我的应用程序中有很多这些并且保持它们同步,因为我的样式改变是一种痛苦。

那么我怎么能模块化视图所以我可以像这样传递表达式:

@Html.Partial("Edit Property", Function(model) model.Name)

或者我没有看到这个问题的更一般的解决方案吗?

1 个答案:

答案 0 :(得分:0)

使用编辑器模板。我有write up on my blog here,但TL; DR版本适用于每种类型的东西(可以是类型,类或值; DataType枚举的成员之一;或者虚拟您想通过UIHint)获得的任何内容,都可以在Views\Shared\EditorTemplates中创建部分视图。在这些视图中,您可以在使用属性调用Html.EditorFor时放置您想要呈现的任何HTML。

例如,如果你有一个属性:

public DateTime Foo { get; set; }

您在Views\Shared\EditorTemplates\DateTime.cshtml添加了以下部分视图:

<div class="form-group">
    @Html.Label("", htmlAttributes:=New With {.class = "control-label col-md-2"})
    <div class="col-md-10">
        @Html.TextBox("", New With { .htmlAttributes = New With { .class = "form-control" } })
        @Html.ValidationMessage("", "", New With { .class = "text-danger" })
    </div>
</div>

然后,您在视图中所要做的就是:

@Html.EditorFor(m => m.Foo)

将呈现所有HTML。