我已经看过了,但它对我没有帮助
- GetFullHtmlFieldId 返回错误的 id 属性值 https://stackoverflow.com/questions/15457883/getfullhtmlfieldid-returning-incorrect-id-attribute-value
- ASP.NET GetFullHtmlFieldId 未返回有效 ID https://stackoverflow.com/questions/2838196/asp-net-getfullhtmlfieldid-not-returning-valid-id
Problem
基本上我有以下问题:
我有一个自定义验证属性,需要获取控件的 fieldId
public class MyValidationAttribute : ValidationAttribute, IClientValidatable
{
//...... Collapsed code
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
ViewContext vwContext = context as ViewContext;
var fieldId = vwContext.ViewData.TemplateInfo.GetFullHtmlFieldId(metadata.PropertyName);
//...... Collapsed code
yield return clientValidationRule;
}
//...... Collapsed code
}
的结果GetFullHtmlFieldId
取决于我如何构建我的 asp.net mvc 页面:
// Edit.cshtml or Create.cshtml
@Html.EditorFor(model => model.MyBoolProperty)
// Shared/EditorTemplates/Boolean.cshtml
@Html.CheckBoxFor(model => model)
的结果GetFullHtmlFieldId
不正确: MyBoolProperty_MyBoolProperty
// Edit.cshtml or Create.cshtml
@Html.CheckBoxFor(model => model.MyBoolProperty)
的结果GetFullHtmlFieldId
correct:我的布尔属性
即使使用更复杂的编辑器,我也会看到这种不正确的行为
// Edit.cshtml or Create.cshtml
@Html.EditorFor(model => model.JustAnArray[1].ComplexProperty.MyBooleanProperty)
// Shared/EditorTemplates/Boolean.cshtml
@Html.CheckBoxFor(model => model)
的结果GetFullHtmlFieldId
不正确:JustAnArray_1__ComplexProperty_MyBoolProperty_MyBoolProperty
// Edit.cshtml or Create.cshtml
@Html.CheckBoxFor(model => model.JustAnArray[1].ComplexProperty.MyBooleanProperty)
的结果GetFullHtmlFieldId
correct:JustAnArray_1__ComplexProperty_MyBoolProperty
这也返回正确的值
// Edit.cshtml or Create.cshtml
@Html.EditorFor(model => model.JustAnArray[1])
// Shared/EditorTemplates/ComplexProperty.cshtml
@Html.CheckBoxFor(model => model.MyBooleanProperty)
的结果GetFullHtmlFieldId
correct:JustAnArray_1__ComplexProperty_MyBoolProperty
看起来像这样使用@Html.CheckBoxFor(model => model)
,它给出了不正确的结果,但是当使用@Html.CheckBoxFor(model => model.MyBoolProperty)
它正在按预期工作
我对其他控件也有同样的问题(比如TextBoxFor
)
Question
如何在验证属性中获取控件的正确 fieldId,而与构建页面的方式无关。
我宁愿使用已经存在的方法(可能与 TextBoxFor 和 CheckBoxFor 以及其他控件使用的方法相同)而不是mimic这个已经存在的功能。如果我模仿 fieldId 的生成,我会进行更改,我不会处理 ASP.NET 控件处理的所有情况。