Asp.net mvc 远程验证可用于文本框失去焦点,但ModelState.IsValid始终为true
我有一个带有RemoteValidation属性的模型 当我输入数据库中已经存在的“test”并单击OK按钮之外的区域时,我会得到红色:“test ready exists.”到目前为止还不错。当我点击“确定”按钮后,我请求的创建操作就完成了 ModelState.IsValid哪个始终为真 因此,数据被输入数据库,我得到一个重复的异常 我知道这在我的网站上是可行的,我只是改变了一些东西,而subversion不是 已激活arghh 我错了什么Asp.net mvc 远程验证可用于文本框失去焦点,但ModelState.IsValid始终为true,asp.net-mvc,jquery-validate,remote-validation,Asp.net Mvc,Jquery Validate,Remote Validation,我有一个带有RemoteValidation属性的模型 当我输入数据库中已经存在的“test”并单击OK按钮之外的区域时,我会得到红色:“test ready exists.”到目前为止还不错。当我点击“确定”按钮后,我请求的创建操作就完成了 ModelState.IsValid哪个始终为真 因此,数据被输入数据库,我得到一个重复的异常 我知道这在我的网站上是可行的,我只是改变了一些东西,而subversion不是 已激活arghh 我错了什么 [HttpPost] public
[HttpPost]
public ActionResult Create(Release release)
{
if (ModelState.IsValid)
{
_releaseDataProvider.AddRelease(release);
return Json(new { success = true });
}
return PartialView(release);
}
public JsonResult ReleaseExists(string Name)
{
bool releaseExists = _releaseDataProvider.ReleaseExists(Name);
if (!releaseExists)
{
return Json(true, JsonRequestBehavior.AllowGet);
}
else
{
return Json(false, JsonRequestBehavior.AllowGet);
}
}
$.ajaxSetup({ cache: false });
$(document).ready(function () {
$('#CreateRelease').click(function (event) { loadDialog(this, event, createRelease); });
});
function loadDialog(link, e, ajaxRequest) {
e.preventDefault();
var $title = link.innerHTML;
var $contenturl = $(link).attr('href');
var $dialog = $('<div></div>');
var $height = $(link).attr('data-dialog-height');
var $width = $(link).attr('data-dialog-width');
$dialog.load($contenturl).dialog({
title: $title,
autoOpen: true,
modal: true,
show: 'fade',
hide: 'fade',
width: $width,
height: $height,
buttons: {
"OK": function () {
ajaxRequest($(this), $('form', this));
},
"Cancel": function () {
$dialog.dialog("close");
}
}
});
}
function createRelease(dlg, form) {
$.ajax({
url: $(form).attr('action'),
type: 'POST',
data: form.serialize(),
success: function (response) {
if (response.success) {
dlg.dialog("close");
// Update UI
}
else {
// Reload the dialog with the form to show model/validation errors
dlg.html(response);
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(textStatus + '-' + XMLHttpRequest.responseText);
}
});
}
[HttpPost]
公共行动结果创建(发布)
{
if(ModelState.IsValid)
{
_releaseDataProvider.AddRelease(release);
返回Json(新的{success=true});
}
返回部分视图(发布);
}
public JsonResult ReleaseExists(字符串名称)
{
bool releaseExists=\u releaseDataProvider.releaseExists(名称);
如果(!releaseExists)
{
返回Json(true,JsonRequestBehavior.AllowGet);
}
其他的
{
返回Json(false,JsonRequestBehavior.AllowGet);
}
}
$.ajaxSetup({cache:false});
$(文档).ready(函数(){
$('#CreateRelease')。单击(函数(事件){loadDialog(this,event,CreateRelease);});
});
函数加载对话框(链接、e、ajaxRequest){
e、 预防默认值();
var$title=link.innerHTML;
var$contenturl=$(link.attr('href');
变量$dialog=$('');
var$height=$(link.attr('data-dialog-height');
var$width=$(link.attr('data-dialog-width');
$dialog.load($contenturl.dialog)({
头衔:$title,
自动打开:对,
莫代尔:是的,
节目:“褪色”,
隐藏:“褪色”,
宽度:$width,
高度:$height,
按钮:{
“OK”:函数(){
ajaxRequest($(this),$('form',this));
},
“取消”:函数(){
$dialog.dialog(“关闭”);
}
}
});
}
函数createRelease(dlg,form){
$.ajax({
url:$(form.attr('action'),
键入:“POST”,
数据:form.serialize(),
成功:功能(响应){
if(response.success){
dlg.对话框(“关闭”);
//更新用户界面
}
否则{
//使用表单重新加载对话框以显示模型/验证错误
html(回应);;
}
},
错误:函数(XMLHttpRequest、textStatus、ErrorSprown){
警报(textStatus+'-'+XMLHttpRequest.responseText);
}
});
}
ModelState.IsValid哪个始终为真
这是正常的,只有当您通过AJAX调用控制器操作时,才会应用远程验证规则。正常提交表单时,不会调用相同的操作。因此,您可以在POST操作中调用相应的验证方法:
[HttpPost]
public ActionResult Create(Release release)
{
if (ModelState.IsValid && !_releaseDataProvider.ReleaseExists(release.Name))
{
_releaseDataProvider.AddRelease(release);
return Json(new { success = true });
}
return PartialView(release);
}
在您编写的另一个线程(猜猜是哪一个:P)中,我可以覆盖RemoteAttribute.IsValid对我的情况也有效吗?是的,您可以覆盖它,在这种情况下,ModelState.IsValid将被设置为正确的值。这意味着我不需要在创建操作中调用ReleaseExists,但是,是否存在这样的竞争条件,即用户在离开文本框时单击OK按钮上的“测试”数据,此时调用我的Create操作可能比调用ReleaseExists操作返回false更快。你也这么认为吗?我又读了你的评论,达林。“这很正常,只有当您通过AJAX调用控制器操作时,才会应用远程验证规则。”。或者您的意思是,通常远程验证只能在客户端进行,而不能在服务器端进行?