Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.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
Javascript mvc3验证输入';不等于';_Javascript_Jquery_Asp.net Mvc_Asp.net Mvc 3_Unobtrusive Validation - Fatal编程技术网

Javascript mvc3验证输入';不等于';

Javascript mvc3验证输入';不等于';,javascript,jquery,asp.net-mvc,asp.net-mvc-3,unobtrusive-validation,Javascript,Jquery,Asp.net Mvc,Asp.net Mvc 3,Unobtrusive Validation,“我的表单”具有默认帮助器文本的输入,用于指导用户输入内容(而不是使用标签)。这使得验证变得棘手,因为输入值从不为null 如何扩展不引人注目的验证来处理此问题?如果名称输入等于“请输入您的姓名…”,则该表单应无效 我开始阅读验证适配器,但我不确定这是否是正确的方法?我需要能够根据不同的字段验证不同的默认值 谢谢是的,这是正确的方法。您应该实现自己的atribute并实现IClientValidable 您还可以将所需的布尔值最初设置为false,作为隐藏表单字段。当用户更改文本框时,将其设置为

“我的表单”具有默认帮助器文本的输入,用于指导用户输入内容(而不是使用标签)。这使得验证变得棘手,因为输入值从不为null

如何扩展不引人注目的验证来处理此问题?如果名称输入等于“请输入您的姓名…”,则该表单应无效

我开始阅读验证适配器,但我不确定这是否是正确的方法?我需要能够根据不同的字段验证不同的默认值


谢谢

是的,这是正确的方法。您应该实现自己的atribute并实现
IClientValidable


您还可以将所需的布尔值最初设置为
false
,作为隐藏表单字段。当用户更改文本框时,将其设置为true。

理想的解决方案是一个自定义属性,您可以在其中指定最小和最大长度以及MustNotContain=“请输入您的姓名…”。

您可以使您的ViewModel实现IValidatableObject,并在实现Validate方法时(来自IValidatableObject)添加一些逻辑来检查属性值,例如

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
        var results = new List<ValidationResult>();

        if (Name == "Please enter your name...") 
            results.Add(new ValidationResult("You must enter a name");

        ...
        Enter other validation here
        ...     

        return results;
    }
公共IEnumerable验证(ValidationContext ValidationContext){ var results=新列表(); 如果(姓名==“请输入您的姓名…”) 添加(新的ValidationResult(“您必须输入名称”); ... 在此处输入其他验证 ... 返回结果; }
现在,当在控制器中调用Model.IsValid时,将运行此逻辑位,并将正常返回验证错误。

以下示例说明如何继续实现自定义验证属性:

public class NotEqualAttribute : ValidationAttribute, IClientValidatable
{
    public string OtherProperty { get; private set; }
    public NotEqualAttribute(string otherProperty)
    {
        OtherProperty = otherProperty;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var property = validationContext.ObjectType.GetProperty(OtherProperty);
        if (property == null)
        {
            return new ValidationResult(
                string.Format(
                    CultureInfo.CurrentCulture, 
                    "{0} is unknown property", 
                    OtherProperty
                )
            );
        }
        var otherValue = property.GetValue(validationContext.ObjectInstance, null);
        if (object.Equals(value, otherValue))
        {
            return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
        }
        return null;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = ErrorMessage,
            ValidationType = "notequalto",
        };
        rule.ValidationParameters["other"] = OtherProperty;
        yield return rule;
    }
}
控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel
        {
            Prop1 = "foo",
            Prop2 = "foo"
        });
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}
和视图:

@model MyViewModel

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script type="text/javascript">
    jQuery.validator.unobtrusive.adapters.add(
        'notequalto', ['other'], function (options) {
            options.rules['notEqualTo'] = '#' + options.params.other;
            if (options.message) {
                options.messages['notEqualTo'] = options.message;
            }
    });

    jQuery.validator.addMethod('notEqualTo', function(value, element, param) {
        return this.optional(element) || value != $(param).val();
    }, '');
</script>

@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(x => x.Prop1)
        @Html.EditorFor(x => x.Prop1)
        @Html.ValidationMessageFor(x => x.Prop1)
    </div>
    <div>
        @Html.LabelFor(x => x.Prop2)
        @Html.EditorFor(x => x.Prop2)
        @Html.ValidationMessageFor(x => x.Prop2)
    </div>
    <input type="submit" value="OK" />
}
@model MyViewModel
jQuery.validator.unobtrusive.adapters.add(
'notequalto',['other'],函数(选项){
options.rules['notEqualTo']='#'+options.params.other;
if(options.message){
options.messages['notEqualTo']=options.message;
}
});
jQuery.validator.addMethod('notEqualTo',函数(值、元素、参数){
返回此.optional(element)| | value!=$(param).val();
}, '');
@使用(Html.BeginForm())
{
@LabelFor(x=>x.Prop1)
@EditorFor(x=>x.Prop1)
@Html.ValidationMessageFor(x=>x.Prop1)
@LabelFor(x=>x.Prop2)
@EditorFor(x=>x.Prop2)
@Html.ValidationMessageFor(x=>x.Prop2)
}

问您的问题花了一点时间,但如果您仍然喜欢数据注释,则可以使用以下方法轻松解决此问题:

上面,字段值与一些预定义文本进行比较。或者,您可以相互比较字段值:

[AssertThat("FieldA != FieldB")]
…当比较字符串的情况无关紧要时:

[AssertThat("CompareOrdinalIgnoreCase(FieldA, FieldB) != 0")]

为了改进@Darin Dimitrov的回答,如果您想使用
ErrorMessageResourceName和ErrorMessageResourceType添加来自资源的消息,只需将其添加到错误消息
ErrorMessage=ErrorMessage??ErrorMessageString


ErrorMessageString将查找使用这些参数(ErrorMessageResourceName和ErrorMessageResourceType)在模型中设置的错误消息的本地化版本

我真的不明白这个答案与这里要问的问题有什么关系,即如何验证视图模型上的两个属性是否不相等。我将问题理解为-我如何知道名称字段包含有效名称而不是默认值“请输入您的名称”。这种性质的验证可以使用ve执行ry generic属性,可以在许多字段上使用。它的作用类似于一个符咒,但您提供的解决方案不能使用ErrorMessageResourceType和ErrorMessageResourceName。您可以使用类似以下内容:errorMessage=new ResourceManager(ErrorMessageResourceType)。GetString(ErrorMessageResourceName);回答得很好,非常有助于我正确地进行一些自定义验证。我很好奇如何使用资源中的错误消息。Rookian所说的不是常量表达式,因此不能在属性中使用。此解决方案与资源错误消息一起工作,但我看不到区别。我认为查看消息不是常量ING正确地连接了它?它与EditorFor一起工作,但不与DROPPDLIST一起工作。它不生成数据验证消息。知道我应该怎么做吗?或者,考虑使用显示“请输入您的名字……”的指令文本作为一个更友好的UX和符合HTML5标准的方式来向用户提供提示。
[AssertThat("FieldA != FieldB")]
[AssertThat("CompareOrdinalIgnoreCase(FieldA, FieldB) != 0")]