【问题标题】:MVC3 Custom String Client Validation not workingMVC3 自定义字符串客户端验证不起作用
【发布时间】:2013-06-16 14:01:48
【问题描述】:

MVC3 和 jquery 不显眼的验证新手。我正在尝试为我的 mvc 视图模型属性实现一个非常简单的自定义字符串验证。我知道有一个现有的“必需”属性,但想使用我的自定义进行测试。

这是我的自定义验证器类:

public class StringRequiredAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        string valueToValidate = value.ToString();

        if ((value == null ) || (valueToValidate.IsEmpty()))
        {
            return false;
        }

        return true;
    }

    public override string FormatErrorMessage(string name)
    {
        return "formatting my custom message here...";
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
            ValidationType = "stringrequired"
        };

        yield return rule;
    }
}

这是视图模型类的属性声明:

[Display(Name = "Custom Property")]
[StringRequired(ErrorMessage="My custom error message goes here")]
public string MyProperty { get; set; }

这是我的脚本:

jQuery.validator.unobtrusive.adapters.add('stringrequired', [], function (options) {
    options.rules['stringrequired'] = true;
    options.messages['stringrequired'] = options.message;
}
);

jQuery.validator.addMethod('stringrequired', function (value, element, params) {
    //problem is this method is never fired
    if (value == undefined || value == null)
       return false;

    if (value.toString().length == 0)
       return false;

    return true;
},'');

这是我的 html 标记:

<textarea cols="20" data-val="true" data-val-stringrequired="My custom message is
 displayed here" id="MyProperty" name="MyProperty" rows="2">
</textarea>

我在 web.config 中将 ClientValidationEnabled 和 UnobtrusiveJavaScriptEnabled 设置为“true”

由于某种原因,这不起作用。非常感谢这里的帮助。谢谢!

【问题讨论】:

  • 究竟是什么不起作用?错误信息?未处理的异常?
  • @Jay See //problem is this method is never fired
  • 尝试使用 @Html.TextAreaFor&lt;&gt; 渲染标签,并确保您正在加载对 jQuery 非侵入式库的引用。
  • 是的,该属性按照 jay 的建议呈现,并引用了所有必要的库。我不确定为什么没有触发客户端方法。
  • 您是否测试过其他通用验证属性以查看它们是否正在触发?记住它必须在一个表单中,并且 MVC 必须能够检测到这个表单

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


【解决方案1】:

我想我会加我的 2 美分。

我创建了一个演示项目,并随意复制并粘贴了您的代码,它对我很有用。 (必须将 valueToValidate.IsEmpty() 更改为 String.IsNullOrEmpty(valueToValidate))。

唯一的区别是我的观点(因为你没有展示你的观点):

@model Test.Models.MyClass
@{
    ViewBag.Title = "Home Page";
}
@using (Html.BeginForm("Post", "Home", FormMethod.Post))
{
    @Html.TextAreaFor(x=>x.MyProperty)
    @Html.ValidationMessageFor(x=>x.MyProperty)

    <input type="submit" value="submit" id="Submit" />
}

确保我引用的是: jQuery、jQuery.Validate、jQuery.Validate.Unobtrusive(按此顺序)

并且你上面的验证javascript被称为在此之后

最后我重申一下,因为它困扰了我好几个小时:

如果您没有围绕验证的表单在同一视图中,MVC 不会将正确的验证信息写入响应中。

有一种方法可以通过在 ViewContext 中创建一个虚拟 FormContext 来强制执行此操作,基本上将这一行放在局部视图的顶部:

ViewContext.FormContext = new FormContext();

这将诱使 MVC 抽出验证内容

Reference

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    相关资源
    最近更新 更多