Validation MVC 3验证-仅在失去焦点或提交后显示错误消息?
我已经在我的MVC 3应用程序中使用数据注释(必需、stringlength等)设置了实体,并且MVC页面适当地显示了验证错误消息。但是,在用户有机会输入无效值之前,一旦页面加载到新表单上,就会显示错误消息 几年前,我使用了JQuery验证,只有在用户对某个字段失去关注或试图提交表单后,我才能显示错误消息。事实上,我认为这是默认行为 在MVC 3中使用DataAnnotation是否也可以这样做 编辑:这是HTMLValidation MVC 3验证-仅在失去焦点或提交后显示错误消息?,validation,asp.net-mvc-3,jquery-validate,data-annotations,Validation,Asp.net Mvc 3,Jquery Validate,Data Annotations,我已经在我的MVC 3应用程序中使用数据注释(必需、stringlength等)设置了实体,并且MVC页面适当地显示了验证错误消息。但是,在用户有机会输入无效值之前,一旦页面加载到新表单上,就会显示错误消息 几年前,我使用了JQuery验证,只有在用户对某个字段失去关注或试图提交表单后,我才能显示错误消息。事实上,我认为这是默认行为 在MVC 3中使用DataAnnotation是否也可以这样做 编辑:这是HTML <div class="form horizontal floated w
<div class="form horizontal floated w50p">
<h3>Billing Information</h3>
@using(Html.BeginForm()){
<div class="item">
<div class="label">
<label>* First Name</label></div>
<div class="value">@Html.TextBoxFor(x => x.Name)</div>
<div class="value">@Html.ValidationMessageFor(x => x.Name)</div>
</div>
<div class="item">
<div class="label">
<label>* Address 1</label></div>
<div class="value">@Html.TextBoxFor(x => x.Street1)</div>
<div class="value">@Html.ValidationMessageFor(x => x.Street1)</div>
</div>
<div class="item">
<div class="label">
<label>Address 2</label></div>
<div class="value">@Html.TextBoxFor(x => x.Street2)</div>
</div>
<div class="item">
<div class="label">
<label>Address 3</label></div>
<div class="value">@Html.TextBoxFor(x => x.Street3)</div>
</div>
<div class="item">
<div class="label">
<label>City</label></div>
<div class="value">@Html.TextBoxFor(x => x.City)</div>
<div class="value">@Html.ValidationMessageFor(x => x.City)</div>
</div>
<div class="item">
<div class="label">
<label>State/Province/Region</label></div>
<div class="value">@Html.TextBoxFor(x => x.StateProv)</div>
<div class="value">@Html.ValidationMessageFor(x => x.StateProv)</div>
</div>
<div class="item">
<div class="label">
<label>Zip / Postal Code</label></div>
<div class="value">@Html.TextBoxFor(x => x.PostalCode)</div>
<div class="value">@Html.ValidationMessageFor(x => x.PostalCode)</div>
</div>
<div class="item">
<div class="label">
<label>* Contact Phone</label></div>
<div class="value">@Html.TextBoxFor(x => x.ContactPhone)</div>
<div class="value">@Html.ValidationMessageFor(x => x.ContactPhone)</div>
</div> <input type="submit" value="Submit" />
}
计费信息
@使用(Html.BeginForm()){
*名字
@Html.TextBoxFor(x=>x.Name)
@Html.ValidationMessageFor(x=>x.Name)
*地址1
@Html.TextBoxFor(x=>x.Street1)
@Html.ValidationMessageFor(x=>x.Street1)
地址2
@Html.TextBoxFor(x=>x.Street2)
地址3
@Html.TextBoxFor(x=>x.Street3)
城市
@Html.TextBoxFor(x=>x.City)
@Html.ValidationMessageFor(x=>x.City)
州/省/地区
@Html.TextBoxFor(x=>x.StateProv)
@Html.ValidationMessageFor(x=>x.StateProv)
邮政编码
@Html.TextBoxFor(x=>x.PostalCode)
@Html.ValidationMessageFor(x=>x.PostalCode)
*联络电话
@Html.TextBoxFor(x=>x.ContactPhone)
@Html.ValidationMessageFor(x=>x.ContactPhone)
}
您的意思是启用客户端验证?当然,那很容易。只是:
public class ProductViewModel
{
[Required] // <-- you could use any data annotation attributes you like
public string Name { get; set; }
}
视图:
如果您想处理自定义验证属性,您可以这样做,但这可能是一个错误。一旦你面对现实世界的应用程序并意识到使用属性(数据注释)进行声明性验证的弱点,我强烈建议你检查一下。默认行为正是你所描述的(只有在字段失去焦点或表单提交后才会出现错误)。因此,您的视图或控制器一定有问题。具体地说,验证程序听起来好像认为用户即使在表单的第一个视图上也在发帖。表单的第一个视图应该是
GET
而不是POST
。如果粘贴控制器代码,这可能有助于我们更好地进行诊断。我目前正在对GET和POST使用相同的操作。你能举个例子说明验证器是如何混淆的吗?我仔细检查了一下,当页面第一次加载时,RequestType在控制器操作中是一个“get”。然后在表单有效并提交时发送“POST”。我目前正在使用数据注释来装饰我的模型,以便进行客户端/服务器端验证。我没有遇到任何值得一提的问题,但由于我刚刚开始使用MVC应用程序,我对您发现的数据批注与您提到的FluentValidation.NET相比的不足之处很感兴趣。@Jed,让我们举一个非常常见的例子:假设您有一个包含复选框的表单。根据是否选中该复选框,您需要确保模型上的某些其他属性是必需的。如果未选中复选框,则不需要这些属性。使用声明性数据批注属性执行此操作似乎有点难看。@Jed-IValidatableObject是否比DataAnnotation属性更适合该场景?@chief7-您指的是哪种场景?
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new ProductViewModel();
return View(model);
}
[HttpPost]
public ActionResult Index(ProductViewModel model)
{
return View(model);
}
}
@model ProductViewModel
<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>
@using (Html.BeginForm())
{
@Html.LabelFor(x => x.Name)
@Html.EditorFor(x => x.Name)
@Html.ValidationMessageFor(x => x.Name)
<input type="search" value="OK" />
}
<appSettings>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>