Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC GetFullHtmlField未返回有效id_C#_Asp.net Mvc_Asp.net Mvc 5 - Fatal编程技术网

C# ASP.NET MVC GetFullHtmlField未返回有效id

C# 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

我看了一眼,但没帮上忙

  • 问题 基本上,我有以下问题:

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

    希望有帮助

    省去了我几个小时的挠头。干杯