不仅可以自定义编辑器模板,还可以自定义外部html

时间:2013-05-01 12:38:31

标签: c# asp.net-mvc-3 template-engine

在MVC.Net 3中,我可以使用EditorTemplate自定义String和其他基本类型的渲染方式。

例如,如果我有EditorTemplates/String.cshtml

@Html.TextBox("")

我得到了默认渲染。 考虑一下简单的模型:

class Foo
{
   public string Route {get; set; }
}

表单的呈现会产生类似的结果:

<div class="editor-label"><label for="Route">Test Route</label></div>
<div class="editor-field">
   <input data-val="true" data-val-required="The Test Route field is required." id="Route" name="Route" type="text"> 
   <span class="field-validation-valid" data-valmsg-for="Route" data-valmsg-replace="true"></span>
</div>

这是一个问题:使用String.chtml我只能自定义div editor-field的内部html。我怎样才能自定义div本身来添加css类和其他属性?

由于

4 个答案:

答案 0 :(得分:1)

您需要在object.cshtml文件夹中实施自定义Shared/EditorTemplates/

有关示例实现,请参阅this questionthis one

答案 1 :(得分:1)

有两种方法可以自定义您需要的内容。

  1. 为模型对象Foo添加编辑器模板。这种方式导致模板和模型之间的耦合连接。必须在模板上应用模型中的每个更改。
  2. 通过在Views/ControllerName/EditorTemplatesViews/Shared/EditorTemplates中添加Object.cshtm来覆盖内部对象模板。这是更通用和松散的。
  3. 有关自定义对象模板视图this链接的详细信息。

    编辑:

    Object.cshtml中,您可以检查Foo模型并应用Foo的特定自定义。

     @if (Model is Foo)
     {
        //specific customization for the Foo
     }
    

答案 2 :(得分:0)

这是扩展方法EditorFor有用的地方。如果您使用String.cshmlt,则会写出您在模板中包含的任何标记(例如EditorFor)。所以你可以在模板中使用它:

// you can basically do whatever you want here  
// add some label, span, etc.
<div class="some-class">
    <div class="another-class">
        @Html.TextBox(string.Empty, /* Name suffix */
            ViewData.TemplateInfo.FormattedModelValue /* Initial value */
        )
    </div>
</div>

让视图引擎通过执行以下操作来呈现它:

@Html.EditoFor(m=>m.Route)

答案 3 :(得分:0)

所有发布的答案都是有效的,但可能会过度设计解决方案。如果您担心避免紧耦合,您可以保持von v的答案中描述的编辑器模板通用,并通过模板的ViewData集合将其他参数传递给它。例如,如果您有一串其他类要添加到外部div ...

@if (ViewData.ContainsKey("additionalClasses"))
{
    /* Append classes to div */
}
else 
{
    /* Div without classes */
}

现在,您可以从主视图中传递additionalClasses,如下所示:

@EditorFor(m => m.Route, "MyTemplate", new { additionalClasses = "myclass" })