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

本文关键字:返回 有效 id NET MVC GetFullHtmlFieldId ASP | 更新日期: 2023-09-27 18:13:32

我看了一下,但是没有用

  1. GetFullHtmlFieldId返回错误的id属性值
  2. ASP。. NET GetFullHtmlFieldId没有返回有效id

基本上我有以下问题:

我有一个自定义验证属性,它需要获得控件的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)

result of GetFullHtmlFieldId incorrect: MyBoolProperty_MyBoolProperty

// Edit.cshtml or Create.cshtml    
@Html.CheckBoxFor(model => model.MyBoolProperty)

result of GetFullHtmlFieldId correct: MyBoolProperty


即使是更复杂的编辑器,我也会看到这种不正确的行为

// Edit.cshtml or Create.cshtml  
@Html.EditorFor(model => model.JustAnArray[1].ComplexProperty.MyBooleanProperty)
// Shared/EditorTemplates/Boolean.cshtml
@Html.CheckBoxFor(model => model)

result of GetFullHtmlFieldId incorrect: JustAnArray_1__ComplexProperty_MyBoolProperty_MyBoolProperty

// Edit.cshtml or Create.cshtml  
@Html.CheckBoxFor(model => model.JustAnArray[1].ComplexProperty.MyBooleanProperty)

result of 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)

result of GetFullHtmlFieldId correct: JustAnArray_1__ComplexProperty_MyBoolProperty

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

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

我如何在我的验证属性中获得控件的正确fieldId,与您如何构建页面无关。

我宁愿使用已经存在的方法(也许与TextBoxFor和CheckBoxFor以及其他控件使用的方法相同)而不是模仿这个已经存在的功能。如果我模仿fieldId的生成,我有一个改变,我不照顾所有的情况,其中ASP。. NET控件负责。

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

似乎有效的前缀取决于用于构建页面的表达式,而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", {});
});

希望有帮助!