0

在 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 的内部 html editor-field。我如何还可以自定义 div 本身以添加 css 类和其他属性?

谢谢

4

4 回答 4

1

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

  1. 为您的模型对象添加一个编辑器模板Foo。这种方式导致模板和模型之间的耦合连接。模型中的每个更改都必须应用于模板。
  2. Views/ControllerName/EditorTemplates通过在or中添加 Object.cshtm 来覆盖内部对象模板Views/Shared/EditorTemplates。这是更通用和松散耦合。

有关自定义对象模板的更多信息,请查看链接。

编辑:

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

 @if (Model is Foo)
 {
    //specific customization for the Foo
 }
于 2013-05-02T06:34:53.753 回答
1

您需要object.cshtmlShared/EditorTemplates/文件夹中实现自定义。

有关一些示例实现,请参阅此问题此问题

于 2013-05-02T05:04:16.930 回答
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)
于 2013-05-01T13:31:20.933 回答
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" })
于 2013-05-02T08:02:48.760 回答