ASP.NET MVC GetFullHtmlFieldId没有返回有效的id

我已经看过了,但它并没有帮助我

  1. GetFullHtmlFieldId返回不正确的id属性值
  2. ASP.NET GetFullHtmlFieldId没有返回有效的id

问题

基本上我有以下问题:

我有一个自定义validation属性,需要获取控件的fieldId

public class MyValidationAttribute : ValidationAttribute, IClientValidatable { //...... Collapsed code public IEnumerable 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结果正确 :MyBoolProperty


即使使用更复杂的编辑器,我也会看到这种错误行为

 // 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结果正确 :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结果正确 :JustAnArray_1__ComplexProperty_MyBoolProperty

它看起来像使用@Html.CheckBoxFor(model => model) ,它给出了不正确的结果,但是当使用@Html.CheckBoxFor(model => model.MyBoolProperty)它正在按预期工作

我与其他控件(如TextBoxFor )有同样的问题

如何在我的validation属性中获取我的控件的正确fieldId,与您构建页面的方式无关。

我宁愿使用已经存在的方法(可能与TextBoxFor和CheckBoxFor以及其他控件使用的方法相同),而不是模仿这个已经存在的function。 如果我模仿fieldId的生成,我有一个改变我不会处理ASP.NET控件所处理的所有情况。

似乎有效前缀取决于用于构建页面的表达式,而GetClientValidationRules方法无法使用该前缀。 如果某人有解决方案会很好,但是当GetClientValidationRules方法尝试初始化Javascriptvalidation所需的数据时,您可以尝试在客户端解决此问题。

在某些默认validation属性(如[Compare] (取决于第二个字段)上,它们设置参数*.propertyName并在不显眼的适配器中替换*. 具有从输入名称属性检索的有效前缀的部分。 你可以为id尝试类似的方法。

但是,如果您对其他领域感兴趣,则需要这样做。 在这种情况下,您似乎对要validation的相同输入字段的ID感兴趣。 然后,您可以从input元素本身检索它。 它将在不显眼的适配器或方法本身中可用:

 //You could get it in the adapter and pass it to the validator in the "param" adapters.add("dummy", function (options) { var fullFieldId = options.element.id; if (console) console.log("Full field id: " + fullFieldId); setValidationValues(options, "dummy", fullFieldId); }); $jQval.addMethod("dummy", function (value, element, param) { var fullFieldId = param; //do whatever validation logic return true; }); //You could also retrieve it directly in the validator method $jQval.addMethod("dummy", function (value, element, param) { var fullFieldId = element.id; //do whatever validation logic return true; }); adapters.add("dummy", function (options) { setValidationValues(options, "dummy", {}); }); 

希望能帮助到你!