Javascript mvc3验证输入';不等于';
“我的表单”具有默认帮助器文本的输入,用于指导用户输入内容(而不是使用标签)。这使得验证变得棘手,因为输入值从不为null 如何扩展不引人注目的验证来处理此问题?如果名称输入等于“请输入您的姓名…”,则该表单应无效 我开始阅读验证适配器,但我不确定这是否是正确的方法?我需要能够根据不同的字段验证不同的默认值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,作为隐藏表单字段。当用户更改文本框时,将其设置为
谢谢是的,这是正确的方法。您应该实现自己的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")]