新手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>
我有ClientValidationEnabled&amp; UnobtrusiveJavaScriptEnabled在web.config中设置为“true”
由于某种原因,这不起作用。非常感谢这里的帮助。谢谢!
答案 0 :(得分: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抽出验证内容