Asp.net mvc 自定义“EditorFor”助手创建的每个元素

Asp.net mvc 自定义“EditorFor”助手创建的每个元素,asp.net-mvc,asp.net-core-mvc,html-helper,Asp.net Mvc,Asp.net Core Mvc,Html Helper,如果用作EditorFor(x=>x,new{htmlAttributes=new{@class=“x”}}),则可以使用EditorFor帮助程序自动构建模型。问题是,由于它会自动生成标签、字段和验证消息,因此在传递给该方法的匿名类型(new{htmlAttributes=…})中,是否有任何方法可以自定义这些元素中每一个的样式和类?您必须使用EditorTemplate,并且EditorFor帮助程序将根据您的模板自动呈现您的模型,您无需依赖htmlAttributes属性来自定义视图。这样

如果用作
EditorFor(x=>x,new{htmlAttributes=new{@class=“x”}}),则可以使用
EditorFor
帮助程序自动构建模型。问题是,由于它会自动生成标签、字段和验证消息,因此在传递给该方法的匿名类型(
new{htmlAttributes=…}
)中,是否有任何方法可以自定义这些元素中每一个的样式和类?

您必须使用
EditorTemplate
,并且
EditorFor
帮助程序将根据您的模板自动呈现您的模型,您无需依赖
htmlAttributes
属性来自定义视图。这样做的好处是,您的模板可以反复使用,特别是对于
日期时间
格式文件
等类型。您可以参考以下示例:

UserModelTemplate.cshtml:
-------------------------
@model UserModel 

<div class="form-group">
    <label class="hero-label">
         @Html.DisplayNameFor(m=> m.Username)
         <span class="text-danger">
            @Html.ValidationMessageFor(m=> m.Username)
         </span>
     </label>
     @Html.TextBoxFor(m=> m.Username, new { @class = "form-control"})
</div>

你想用
new{htmlAttributes=new{@class=“x”}
做什么,是想从viewmodel属性动态更改类“x”还是
ViewBag
?@tetsuyayayamamoto:不,
EditorFor
能够将整个模型与模型的单个成员一起搭建起来。当自动搭建时,我们如何为每种类型的搭建项定义css类,如标签('text-danger')、字段('form-control')和验证('validation-error')?模板的名称应与类的名称相同(
UserModel.cshtml
在本例中,它被放置在
/Views/Shared/EditorTemplates
文件夹中,然后它就是
@Html.EditorFor(m=>m)
@StephenMuecke:没错,但是覆盖默认行为允许您为单个模型或元素定义多个模板,并在适用的情况下使用它们。是的,但是您不能将其用于集合。在任何情况下,您都可以为每个控制器使用一个
EditorTemplate
(在
/Views/ControllerName/EditorTemplates
文件夹中)@StephenMuecke:例如,假设我们需要格式化货币字段,以及基于特定位置的模型中的其他字段。然后我们可以这样做以动态呈现适当的模板。我实际上会使用
HtmlHelper
扩展方法来做类似的事情。我不是说你不能做你的建议sting(我偶尔会对简单的属性这样做),但对于复杂的模型,通常的做法是将模板命名为与模型相同的名称
@Html.EditorFor(model=> model, "UserModelTemplate")