C# ASP.NET MVC GetFullHtmlField未返回有效id
我看了一眼,但没帮上忙 问题 基本上,我有以下问题: 我有一个自定义验证属性,它需要获取控件的fieldIdC# ASP.NET MVC GetFullHtmlField未返回有效id,c#,asp.net-mvc,asp.net-mvc-5,C#,Asp.net Mvc,Asp.net Mvc 5,我看了一眼,但没帮上忙 问题 基本上,我有以下问题: 我有一个自定义验证属性,它需要获取控件的fieldId public class MyValidationAttribute : ValidationAttribute, IClientValidatable { //...... Collapsed code public IEnumerable<ModelClientValidationRule> GetClientValidationRules(Model
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
}
GetFullHtmlFieldDid的结果不正确:MyBoolProperty\u MyBoolProperty
// Edit.cshtml or Create.cshtml
@Html.CheckBoxFor(model => model.MyBoolProperty)
// Edit.cshtml or Create.cshtml
@Html.CheckBoxFor(model => model.JustAnArray[1].ComplexProperty.MyBooleanProperty)
GetFullHtmlFieldDid的结果正确:MyBoolProperty
// Edit.cshtml or Create.cshtml
@Html.CheckBoxFor(model => model.MyBoolProperty)
// Edit.cshtml or Create.cshtml
@Html.CheckBoxFor(model => model.JustAnArray[1].ComplexProperty.MyBooleanProperty)
即使使用更复杂的编辑器,我也会看到这种不正确的行为
// Edit.cshtml or Create.cshtml
@Html.EditorFor(model => model.JustAnArray[1].ComplexProperty.MyBooleanProperty)
// Shared/EditorTemplates/Boolean.cshtml
@Html.CheckBoxFor(model => model)
GetFullHtmlFieldDid的结果不正确
错误:JustAnArray\u 1\u ComplexProperty\u MyBoolProperty\u MyBoolProperty
// Edit.cshtml or Create.cshtml
@Html.CheckBoxFor(model => model.MyBoolProperty)
// Edit.cshtml or Create.cshtml
@Html.CheckBoxFor(model => model.JustAnArray[1].ComplexProperty.MyBooleanProperty)
GetFullHtmlFieldDid的结果
正确:JustAnArray\u 1\u ComplexProperty\u MyBoolProperty
// Edit.cshtml or Create.cshtml
@Html.CheckBoxFor(model => model.MyBoolProperty)
// Edit.cshtml or Create.cshtml
@Html.CheckBoxFor(model => model.JustAnArray[1].ComplexProperty.MyBooleanProperty)
这也返回了正确的值
// Edit.cshtml or Create.cshtml
@Html.EditorFor(model => model.JustAnArray[1])
// Shared/EditorTemplates/ComplexProperty.cshtml
@Html.CheckBoxFor(model => model.MyBooleanProperty)
GetFullHtmlFieldDid的结果
正确:JustAnArray\u 1\u ComplexProperty\u MyBoolProperty
// Edit.cshtml or Create.cshtml
@Html.CheckBoxFor(model => model.MyBoolProperty)
// Edit.cshtml or Create.cshtml
@Html.CheckBoxFor(model => model.JustAnArray[1].ComplexProperty.MyBooleanProperty)
看起来,使用@Html.CheckBoxFor(model=>model)
会给出不正确的结果,但当使用@Html.CheckBoxFor(model=>model.MyBoolProperty)
时,它会按预期工作
我对其他控件也有同样的问题(如TextBoxFor
)
问题:
如何在validation属性中获取控件的正确fieldId,这与构建页面的方式无关
我宁愿使用已经存在的方法(可能与TextBoxFor和CheckBoxFor以及其他控件使用的方法相同),而不是模仿这个已经存在的功能。如果我模仿fieldId的生成,我会有一个变化,我不会处理ASP.NET控件处理的所有情况 有效前缀似乎取决于用于构建页面的表达式,而这对于
GetClientValidationRules
方法不可用。如果有人能找到解决方案,那就太好了,但是由于方法GetClientValidationRules
正在尝试初始化Javascript验证所需的数据,您可以尝试在客户端解决这个问题
在一些默认的验证属性上,如依赖于第二个字段的[Compare]
,它们设置了一个参数*.propertyName
,并且在不显眼的适配器中,它们用从输入名称属性检索的有效前缀替换*。
部分。您可以对id尝试类似的方法
然而,如果你对另一个领域感兴趣,这将是必要的。在本例中,您似乎对正在验证的同一输入字段的id感兴趣。然后可以从输入元素本身检索它。它将在不引人注目的适配器或方法本身中可用:
//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", {});
});
希望有帮助 省去了我几个小时的挠头。干杯