【发布时间】:2017-08-17 08:48:36
【问题描述】:
当使用任何Input Extension Helper Methods(如@Html.TextboxFor)时,Razor 引擎会自动生成模型中的任何Validation Attributes(通过ClientValidationEnabled/UnobtrusiveJavaScriptEnabled)。
例如,以下情况可以正常工作
型号:
[Required]
public string QuestionOne { get; set; }
查看:
@Html.TextBoxFor(model => model.QuestionOne)
@Html.ValidationMessageFor(model => model.QuestionOne)
生成的标记:
<input type="text" id="QuestionOne" name="QuestionOne" value=""
data-val="true" data-val-required="The QuestionOne field is required." >
<span class="field-validation-valid" data-valmsg-for="QuestionOne" data-valmsg-replace="true"></span>
在这种情况下,属性 data-val="true" 和 data-val-required="The QuestionOne field is required." 被非侵入式验证拾取,并且表单元素被成功验证。
但是,出于可扩展性的原因,我希望能够自己生成<input> 元素,而不是使用TextBoxFor。所以我的视图现在看起来像这样:
<input type="textbox"
id="@Html.IdFor(m => m.QuestionTwo)"
name="@Html.NameFor(m => m.QuestionTwo)"
value="@Model.QuestionTwo"
data-val="true" data-val-required="Selection is Required" />
@Html.ValidationMessageFor(model => model.QuestionTwo)
在这种情况下,我只是通过手动重写data-val="true" (etc) 来伪造验证属性输出,但这必须扩展以涵盖每个案例。
Here's a running Demo in .NET Fiddle
问:我可以为给定元素构建/返回data-val-* 属性列表吗?
【问题讨论】:
-
HtmlHelper有一个返回data-*属性的GetUnobtrusiveValidationAttributes()方法(但您需要从表达式中获取ModelMetaData)。您所显示的只是TextBoxFor()方法生成的完全相同的 html,除了value属性如果属性无效(因为您不再正确绑定)。你想用这个实现什么? -
我的用途更多样化。我想找到一种方法来向this custom
<select>element 和this<input typed="checked">元素添加验证。 -
我知道第一个是你的,但这是一个丑陋的解决方案。在这种情况下处理创建自定义 html 的方法是创建你自己的扩展方法,你可以访问
ModelMetadata和HtmlHelper方法,并且可以完全控制您的 html(在该示例中,视图代码将是(比如说)@Html.GeoDropdownListFor(m=> m.CityId, Model.Cities); -
@Stephen 我和 OP 有类似的失误。我的麻烦是我不知道如何正确实现我自己的 HTML 助手。我只需要处理源代码,这绝对是一场噩梦,充斥着如此多的回调,我很难找到实际的逻辑。
-
你没有尝试
GetUnobtrusiveValidationAttributes()的方法吗?还是你不明白怎么用?
标签: asp.net-mvc razor unobtrusive-validation