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

时间:2014-07-18 10:16:04

标签: c# asp.net-mvc asp.net-mvc-5

我看了一眼,但它没有帮助我

  1. GetFullHtmlFieldId returning incorrect id attribute value
  2. ASP.NET GetFullHtmlFieldId not returning valid id
  3. 问题

    基本上我有以下问题:

    我有一个自定义验证属性,需要获取控件的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 正确的结果: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

    也有同样的问题

    问题

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

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

1 个答案:

答案 0 :(得分:2)

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

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

但是,如果您对其他领域感兴趣,则需要这样做。在这种情况下,您似乎对要验证的相同输入字段的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", {});
});

希望它有所帮助!