远程验证适用于文本框丢失焦点,但ModelState.IsValid始终为true

时间:2012-05-30 19:19:12

标签: asp.net-mvc jquery-validate remote-validation

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

当我输入已经存在于数据库中的“test”时,我点击了除OK按钮以外的区域,然后我得到了红色:“测试已经存在”。到现在为止还挺好。当我点击时,OK按钮发布到我要求的创建动作

ModelState.IsValid总是如此???

因此,数据输入数据库,我得到一个Duplicate Exception ...

我知道这在我的网站上有效,我只是改变了一些东西而且颠覆不是

激活了arghhh ......

我错了什么?

[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);
             }
         });
     } 

1 个答案:

答案 0 :(得分:2)

  

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);            
}