在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类和其他属性?
由于
答案 0 :(得分:1)
您需要在object.cshtml
文件夹中实施自定义Shared/EditorTemplates/
。
有关示例实现,请参阅this question或this one
答案 1 :(得分:1)
有两种方法可以自定义您需要的内容。
Foo
添加编辑器模板。这种方式导致模板和模型之间的耦合连接。必须在模板上应用模型中的每个更改。Views/ControllerName/EditorTemplates
或Views/Shared/EditorTemplates
中添加Object.cshtm来覆盖内部对象模板。这是更通用和松散的。有关自定义对象模板视图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" })