javascript - mvc3 验证输入 'not-equal-to'

标签 javascript jquery asp.net-mvc asp.net-mvc-3 unobtrusive-validation

我的表单输入带有默认帮助文本,可指导用户输入内容(而不是使用标签)。这使得验证变得棘手,因为输入值永远不会为空。

我如何扩展非侵入式验证来处理这个问题?如果姓名输入等于“请输入您的姓名...”,则表单无效

我开始阅读 Brad Wilson's blog post在验证适配器上,但我不确定这是否是正确的方法?我需要能够根据字段验证不同的默认值。

谢谢

最佳答案

下面是一个示例,说明如何继续实现自定义验证属性:

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 MyViewModel
{
    public string Prop1 { get; set; }

    [NotEqual("Prop1", ErrorMessage = "should be different than Prop1")]
    public string Prop2 { get; set; }
}

Controller :

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

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

和 View :

@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" />
}

关于javascript - mvc3 验证输入 'not-equal-to',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5736710/

相关文章:

javascript - 如何从 JavaScript 数组值中找到所有长度的所有排列?

javascript - 单元测试错误 : Cannot call Promise. 然后来自同步测试

javascript - 如果 Else CSS Hovercode 在 jQuery 中不起作用

jquery 隐藏标签中的文本内容,而不是标签本身

asp.net-mvc - VS 2015 不会将我的项目构建为 C# 6.0

c# - 如何将值分配给变量并将其用于 MVC Razor 中的另一个操作

javascript - AJAX Date 无法正确显示日期

javascript - 如何在php中实现 “show sub-checkbox”?

javascript - 使 gridster.js 瓦片粘在特定的网格位置(捕捉到网格)

c# - ASP.NET MVC5 路由到 View 上的 div