Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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中带属性的条件验证_C#_Jquery_Asp.net Mvc_Jquery Validate_Unobtrusive Validation - Fatal编程技术网

C# ASP.NET MVC中带属性的条件验证

C# ASP.NET MVC中带属性的条件验证,c#,jquery,asp.net-mvc,jquery-validate,unobtrusive-validation,C#,Jquery,Asp.net Mvc,Jquery Validate,Unobtrusive Validation,我试图在ASP.NET中创建有条件验证模型的功能。我让它用于服务器端验证,但我不知道如何让它用于客户端验证 比如说, public class Student { [Required] public string Name { get; set; } public bool RequiresAddress { get; set; } [RequiredIf("RequiresAddress", true)] public string

我试图在ASP.NET中创建有条件验证模型的功能。我让它用于服务器端验证,但我不知道如何让它用于客户端验证

比如说,

public class Student
{
    [Required]
    public string Name { get; set; }
    public bool RequiresAddress { get; set; }
    [RequiredIf("RequiresAddress", true)]
    public string Address { get; set; }
}
以下是我的RequiredIf属性(创建以下内容):

然后我有了这个验证器(我使用DataAnnotationsModelValidatorProvider在Global.asax.cs中注册):

正如我所说,服务器端验证工作完美无瑕,但客户端似乎根本无法工作。我有点像是一个使用JavaScript的n00b,所以我不知道如何解决这个问题——我在这里遗漏了什么

更新 我去掉了Validator类,并在自定义属性上实现了IClientValidable。这是我的新报纸。同样,服务器端的一切似乎都按预期工作,但客户端没有工作

您可以从我的视图中看到,我正在使用DevExpress构建表单

p、 美国

公共类requireditAttribute:ValidationAttribute,IClientValidable
{
公共字符串依赖项名称{get;set;}
公共对象依赖值{get;set;}
public requireditAttribute(字符串依赖名、对象依赖值)
{
this.DependentName=DependentName;
this.DependentValue=DependentValue;
}
公共IEnumerable GetClientValidationRules(ModelMetadata元数据、ControllerContext上下文)
{   
var rule=new ModelClientValidationRule();
rule.ErrorMessage=FormatErrorMessage(Metadata.GetDisplayName());
rule.ValidationParameters.Add(“dependentname”,dependentname);
rule.ValidationParameters.Add(“dependentvalue”,dependentvalue);
rule.ValidationType=“requiredif”;
收益率-收益率规则;
}
公共覆盖布尔值有效(对象值)
{
如果(value==null){return false;}
string ValueString=作为字符串的值;
if(ValueString!=null){return(ValueString.Trim().Length!=0);}
返回true;
}
受保护的覆盖ValidationResult有效(对象值、ValidationContext上下文)
{
var ContainerType=Context.ObjectInstance.GetType();
var Field=ContainerType.GetProperty(this.DependentName);
如果(字段!=null)
{
var DependentValue=Field.GetValue(Context.ObjectInstance,null);
if((DependentValue==null&&DependentValue==null)||
(DependentValue!=null&&DependentValue.Equals(this.DependentValue)))
{
如果(!IsValid(值))
{
//返回新的ValidationResult(ErrorMessage,new[]{Context.MemberName});
返回新的ValidationResult(FormatErrorMessage(Context.DisplayName));
}
}
}
返回ValidationResult.Success;
}
公共字符串GetPropertyID(ModelMetadata元数据、ViewContext上下文)
{
字符串DependentID=Context.ViewData.TemplateInfo.getFullHtmlFieldDid(this.DependentName);
var Fie1ldID=Metadata.PropertyName+“382;”;
返回(DependentID.StartsWith(FieldID))
?DependentID.子字符串(字段ID.长度)
:受抚养人TID;
}
}
这是我的视图类和相关的JavaScript:

<script type="text/javascript">
function OnValueChanged(s, e) {
    var Result = ASPxClientCheckBox.Cast(s).GetValue();
    StudentForm.GetItemByName("Address").SetVisible(!Result);
}
</script>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(false)
    @Html.DevExpress().FormLayout(Form =>
    {
        Form.Name = "StudentForm";
        Form.Items.Add(x => x.Name, Item =>
        {
            (Item.NestedExtensionSettings as TextBoxSettings).ShowModelErrors = true;
            (Item.NestedExtensionSettings as TextBoxSettings).Properties.ValidationSettings.ErrorDisplayMode = ErrorDisplayMode.ImageWithTooltip;
            (Item.NestedExtensionSettings as TextBoxSettings).Properties.ValidationSettings.Display = Display.Dynamic;
        });

        Form.Items.Add(x => x.Address, Item =>
        {
            Item.Name = "Address";
            (Item.NestedExtensionSettings as TextBoxSettings).ShowModelErrors = true;
            (Item.NestedExtensionSettings as TextBoxSettings).Properties.ValidationSettings.ErrorDisplayMode = ErrorDisplayMode.ImageWithTooltip;
            (Item.NestedExtensionSettings as TextBoxSettings).Properties.ValidationSettings.Display = Display.Dynamic;
        });

        Form.Items.Add(x => x.AddressHidden, Item =>
        {
            Item.Name = "AddressHidden";
            (Item.NestedExtensionSettings as CheckBoxSettings).Properties.ClientSideEvents.Init = "OnValueChanged";
            (Item.NestedExtensionSettings as CheckBoxSettings).Properties.ClientSideEvents.ValueChanged = "OnValueChanged";
        });

        Form.Items.Add(x => x.AddressRequired);

        Form.Items.Add(x =>
        {
            x.NestedExtensionType = FormLayoutNestedExtensionItemType.Button;
            ButtonSettings Settings = (ButtonSettings)x.NestedExtensionSettings;
            Settings.UseSubmitBehavior = true;
            Settings.Text = "Submit";
            Settings.Name = "SubmitButton";
        });
    }).Bind(Model).GetHtml()
}

<script type="text/javascript">
    jQuery.validator.unobtrusive.adapters.add('requiredif', ['dependentname', 'dependentvalue'], function (options) {
    options.rules["requiredif"] = true;
    options.messages["requiredif"] = options.message;
    });

    $.validator.addMethod('requiredif', function (value, element, params) {
        var id = '#' + $(element).attr("data-val-requiredif-dependentname");
        var dependentvalue = $(element).attr("data-val-requiredif-dependentvalue");
        var actualvalue = $(id).is(":checked");
        if (dependentvalue == "True" && actualvalue && value.length <= 0) {
            return false;
        }
        return true;
    });
</script>

函数OnValueChanged(s,e){
var Result=ASPxClientCheckBox.Cast.GetValue();
StudentForm.GetItemByName(“地址”).SetVisible(!Result);
}
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(false)
@Html.DevExpress().FormLayout(表单=>
{
Form.Name=“StudentForm”;
Form.Items.Add(x=>x.Name,Item=>
{
(Item.NestedExtensionSettings作为TextBoxSettings)。ShowModelErrors=true;
(Item.NestedExtensionSettings作为TextBoxSettings)。Properties.ValidationSettings.ErrorDisplayMode=ErrorDisplayMode.ImageWithTooltip;
(Item.NestedExtensionSettings作为TextBoxSettings)。Properties.ValidationSettings.Display=Display.Dynamic;
});
Form.Items.Add(x=>x.Address,Item=>
{
Item.Name=“地址”;
(Item.NestedExtensionSettings作为TextBoxSettings)。ShowModelErrors=true;
(Item.NestedExtensionSettings作为TextBoxSettings)。Properties.ValidationSettings.ErrorDisplayMode=ErrorDisplayMode.ImageWithTooltip;
(Item.NestedExtensionSettings作为TextBoxSettings)。Properties.ValidationSettings.Display=Display.Dynamic;
});
Form.Items.Add(x=>x.AddressHidden,Item=>
{
Item.Name=“AddressHidden”;
(Item.NestedExtensionSettings作为CheckBoxSettings)。Properties.ClientSideEvents.Init=“OnValueChanged”;
(Item.NestedExtensionSettings作为CheckBoxSettings)。Properties.ClientSideEvents.ValueChanged=“OnValueChanged”;
});
Form.Items.Add(x=>x.AddressRequired);
Form.Items.Add(x=>
{
x、 NestedExtensionType=FormLayoutNestedExtensionItemType.Button;
ButtonSettings设置=(ButtonSettings)x.NestedExtensionSettings;
Settings.UseSubmitBehavior=true;
Settings.Text=“提交”;
Settings.Name=“SubmitButton”;
});
}).Bind(Model).GetHtml()
}
jQuery.validator.unobtrusive.adapters.add('requiredif',['dependentname','dependentvalue'],函数(选项){
options.rules[“requiredif”]=true;
options.messages[“requiredif”]=options.message;
});
$.validator.addMethod('requiredif',函数(值、元素、参数){
变量id='#'+$(元素).attr(“数据值requiredif dependentname”);
var dependentvalue=$(元素).attr(“数据值requiredif dependentvalue”);
变量实际值=$(id).is(“:checked”);

if(dependentvalue==“True”&&actualvalue&&value.length如果您想将附加的态度传递给vie
public class RequiredIfValidator : DataAnnotationsModelValidator<RequiredIfAttribute>
{
    public RequiredIfValidator(ModelMetadata metadata, ControllerContext context, RequiredIfAttribute attribute)
        : base(metadata, context, attribute)
    {
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        var Rule = new ModelClientValidationRule
        {
            ErrorMessage = ErrorMessage,
            ValidationType = "requiredif",
        };

        var viewContext = (ControllerContext as ViewContext);
        string depProp = viewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(Attribute.DependentName);
        Rule.ValidationParameters.Add("dependentname", depProp);
        Rule.ValidationParameters.Add("dependentvalue", Attribute.DependentValue);

        yield return Rule;
    }

    public override IEnumerable<ModelValidationResult> Validate(object container)
    {
        var Field = Metadata.ContainerType.GetProperty(Attribute.DependentName);
        if (Field != null)
        {
            var Value = Field.GetValue(container, null);
            if ((Value == null && Attribute.DependentValue == null) || (Value != null && Value.Equals(Attribute.DependentValue)))
            {
                if (!Attribute.IsValid(Metadata.Model))
                {
                    yield return new ModelValidationResult { Message = ErrorMessage };
                }
            }
        }
    }
}
if (typeof (jQuery) !== "undefined" && typeof (jQuery.validator) !== "undefined") {
    (function ($) {
        $.validator.addMethod('requiredif', function (value, element, parameters) {
            var id = '#' + parameters['dependentname'];
            var dependentvalue = parameters['dependentvalue'];
            dependentvalue = (dependentvalue == null ? '' : dependentvalue).toString();
            var actualvalue = $(id).val();
            if (dependentvalue === actualvalue) {
                return $.validator.methods.required.call(this, value, element, parameters);
            }
            else {
                return true;
            }
        });

    })(jQuery);
}
public class RequiredIfAttribute : ValidationAttribute, IClientValidatable
{
    public string DependentName { get; set; }
    public object DependentValue { get; set; }

    public RequiredIfAttribute(string DependentName, object DependentValue)
    {
        this.DependentName  = DependentName;
        this.DependentValue = DependentValue;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata Metadata, ControllerContext Context)
    {   
        var rule = new ModelClientValidationRule();
        rule.ErrorMessage = FormatErrorMessage(Metadata.GetDisplayName());
        rule.ValidationParameters.Add("dependentname", DependentName);
        rule.ValidationParameters.Add("dependentvalue", DependentValue);
        rule.ValidationType = "requiredif";
        yield return rule;
    }

    public override bool IsValid(object value)
    {
        if (value == null) { return false; }

        string ValueString = value as string;
        if (ValueString != null) { return (ValueString.Trim().Length != 0); }
        return true;
    }

    protected override ValidationResult IsValid(object Value, ValidationContext Context)
    {
        var ContainerType = Context.ObjectInstance.GetType();
        var Field = ContainerType.GetProperty(this.DependentName);

        if (Field != null)
        {
            var DependentValue = Field.GetValue(Context.ObjectInstance, null);
            if ((DependentValue == null && DependentValue == null) ||
                (DependentValue != null && DependentValue.Equals(this.DependentValue)))
            {
                if (!IsValid(Value))
                {
                    //return new ValidationResult(ErrorMessage, new[] { Context.MemberName });
                    return new ValidationResult(FormatErrorMessage(Context.DisplayName));
                }
            }
        }
        return ValidationResult.Success;
    }

    public string GetPropertyID(ModelMetadata Metadata, ViewContext Context)
    {
        string DependentID = Context.ViewData.TemplateInfo.GetFullHtmlFieldId(this.DependentName);
        var Fie1ldID = Metadata.PropertyName + "_";
        
        return (DependentID.StartsWith(FieldID))
            ? DependentID.Substring(FieldID.Length)
            : DependentID;
    }
}
<script type="text/javascript">
function OnValueChanged(s, e) {
    var Result = ASPxClientCheckBox.Cast(s).GetValue();
    StudentForm.GetItemByName("Address").SetVisible(!Result);
}
</script>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(false)
    @Html.DevExpress().FormLayout(Form =>
    {
        Form.Name = "StudentForm";
        Form.Items.Add(x => x.Name, Item =>
        {
            (Item.NestedExtensionSettings as TextBoxSettings).ShowModelErrors = true;
            (Item.NestedExtensionSettings as TextBoxSettings).Properties.ValidationSettings.ErrorDisplayMode = ErrorDisplayMode.ImageWithTooltip;
            (Item.NestedExtensionSettings as TextBoxSettings).Properties.ValidationSettings.Display = Display.Dynamic;
        });

        Form.Items.Add(x => x.Address, Item =>
        {
            Item.Name = "Address";
            (Item.NestedExtensionSettings as TextBoxSettings).ShowModelErrors = true;
            (Item.NestedExtensionSettings as TextBoxSettings).Properties.ValidationSettings.ErrorDisplayMode = ErrorDisplayMode.ImageWithTooltip;
            (Item.NestedExtensionSettings as TextBoxSettings).Properties.ValidationSettings.Display = Display.Dynamic;
        });

        Form.Items.Add(x => x.AddressHidden, Item =>
        {
            Item.Name = "AddressHidden";
            (Item.NestedExtensionSettings as CheckBoxSettings).Properties.ClientSideEvents.Init = "OnValueChanged";
            (Item.NestedExtensionSettings as CheckBoxSettings).Properties.ClientSideEvents.ValueChanged = "OnValueChanged";
        });

        Form.Items.Add(x => x.AddressRequired);

        Form.Items.Add(x =>
        {
            x.NestedExtensionType = FormLayoutNestedExtensionItemType.Button;
            ButtonSettings Settings = (ButtonSettings)x.NestedExtensionSettings;
            Settings.UseSubmitBehavior = true;
            Settings.Text = "Submit";
            Settings.Name = "SubmitButton";
        });
    }).Bind(Model).GetHtml()
}

<script type="text/javascript">
    jQuery.validator.unobtrusive.adapters.add('requiredif', ['dependentname', 'dependentvalue'], function (options) {
    options.rules["requiredif"] = true;
    options.messages["requiredif"] = options.message;
    });

    $.validator.addMethod('requiredif', function (value, element, params) {
        var id = '#' + $(element).attr("data-val-requiredif-dependentname");
        var dependentvalue = $(element).attr("data-val-requiredif-dependentvalue");
        var actualvalue = $(id).is(":checked");
        if (dependentvalue == "True" && actualvalue && value.length <= 0) {
            return false;
        }
        return true;
    });
</script>
public IEnumerable<ModelClientValidationRule> GetClientValidationRules( ModelMetadata metadata, ControllerContext context)
{
    var rule = new ModelClientValidationRule();
    rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
    rule.ValidationParameters.Add("dependentname", DependentName);
    rule.ValidationParameters.Add("dependentvalue", DependentValue);
    rule.ValidationType = "requiredif";
    yield return rule;
}
if ($.validator && $.validator.unobtrusive) {
    $.validator.unobtrusive.adapters.add('requiredif', ['dependentname', 'dependentvalue'], function(options) {
        options.rules["requiredif"] = options.params;
        options.messages["requiredif"] = options.message;
    });

    $.validator.addMethod('requiredif', function(value, element, params) {
        var dependentElement = $("input[name=" + params["dependentname"] + "]");
        var dependentvalue = params["dependentvalue"];
        var actualvalue = dependentElement.parents(".dxWeb_edtCheckBoxChecked_DevEx:first").length > 0; //is checkbox is checked
        if (dependentvalue == "True" && actualvalue && (value == null || value.length <= 0)) {
            return false;
        }
        return true;
    });
}