提问人:Jason 提问时间:4/23/2011 最后编辑:arielJason 更新时间:4/27/2011 访问量:2990
在 ASP.NET MVC 3 中使用非干扰性验证时阻止表单提交
Prevent form from submitting when using unobtrusive validation in ASP.NET MVC 3
问:
我正在尝试使用 MVC3 不显眼的 javascript 实现远程验证 ASP.NET。
它似乎有效,但即使它不应该有效,我也可以提交我的表格。
看起来验证发生得不够快。我正在将 ASP.NET 开发服务器与 VS 2010 调试器一起使用,并且并不总是触发远程验证方法。当我稍等片刻时,验证就会发生,我无法提交表单。
我开始认为客户端远程验证不够可靠,我可能应该考虑使用服务器端验证来确保应用正确的验证。
有没有办法解决这个问题?
编辑:
就像你问的,这是我的代码中与问题相关的部分。 我将首先听取您的建议,并使用服务器端验证来避免用户绕过我的验证。
型:
[Required(ErrorMessage = "*"), StringLength(50)]
[Remote("EventCategoryNameExists", "EventCategories",
AdditionalFields = "EventCategoryId",
ErrorMessageResourceType = typeof(Messages),
ErrorMessageResourceName = "EventCategoryNameAlreadyExists")]
[LocalizedDisplayName("Name")]
public string Name { get; set; }
视图:
<div id="formMain">
@Html.HiddenFor(x => x.EventCategoryId)
<fieldset class="formFieldset">
<legend>@Labels.EventCategoryDetails</legend>
<div class="formFieldsetContent">
<table id="formTable" class="formTable">
<tr>
<td class="formLabelCell" style="width: 90px;">
@Html.LabelFor(x => x.Name) :
</td>
<td class="formInputCell">
@Html.EditorFor(x => x.Name)
@Html.ValidationMessageFor(x => x.Name)
</td>
</tr>
<tr>
<td class="formLabelCell" style="vertical-align: top;">
@Html.LabelFor(x => x.Color) :
</td>
<td class="formInputCell">
@Html.EditorFor(x => x.Color)
@Html.ValidationMessageFor(x => x.Color)
</td>
</tr>
</table>
</div>
</fieldset>
</div>
<div class="formButtons">
<input type="submit" id="btnSave" value="@Labels.Save" class="formButton" />
<input type="button" id="btnCancel" value="@Labels.Cancel" class="formButton" />
</div>
控制器:
public ActionResult EventCategoryNameExists(int eventCategoryId, string name)
{
return Json(!_eventService.EventCategoryNameExists(eventCategoryId, name), JsonRequestBehavior.AllowGet);
}
答:
客户端验证是远远不够的。不能指望 Javascript 被启用或正确,而且它可以被狡猾的用户绕过。但是,您的客户端验证例程是否返回布尔值 false?否则,无论如何都会执行正常的提交操作。
您的数据注释也在服务器端处理 - 因此就此而言,您可以接受。但是,远程验证属性不是。您需要一个自定义验证属性,或者还需要在服务器端检查相同的例程。提取对常规方法的验证调用,该方法在 HttpPost 操作中检查(如果失败,请使用 ModelState.AddError),并且还具有远程验证方法,因此您应该很好。远程验证仍然是一个不错的客户端功能,所以如果你想要这个功能,我不会完全放弃它。
至于您的具体计时问题 - 我刚刚在我的远程验证页面上进行了一些测试。我将 fiddler 设置为在请求之前有断点。在我从服务器返回响应之前,我无法提交表单。尝试使用 fiddler,看看是否可以以这种方式重现它。我很好奇您页面上的其他内容是否正在踩踏您的远程验证。我在使用较新版本的 jQuery 和远程验证时遇到了问题。当我默认回到基本的 MVC3 项目时,它工作得很好 - 我当时没有进一步调试它,但这是因为版本差异。
评论