Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 远程验证可用于文本框失去焦点,但ModelState.IsValid始终为true_Asp.net Mvc_Jquery Validate_Remote Validation - Fatal编程技术网

Asp.net mvc 远程验证可用于文本框失去焦点,但ModelState.IsValid始终为true

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

我有一个带有RemoteValidation属性的模型

当我输入数据库中已经存在的“test”并单击OK按钮之外的区域时,我会得到红色:“test ready exists.”到目前为止还不错。当我点击“确定”按钮后,我请求的创建操作就完成了

ModelState.IsValid哪个始终为真

因此,数据被输入数据库,我得到一个重复的异常

我知道这在我的网站上是可行的,我只是改变了一些东西,而subversion不是

已激活arghh

我错了什么

[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调用控制器操作时,才会应用远程验证规则。”。或者您的意思是,通常远程验证只能在客户端进行,而不能在服务器端进行?