2012-05-30 26 views
2

我有一個帶有RemoteValidation屬性的模型。遠程驗證對文本框失去焦點有效,但ModelState.IsValid始終爲真

當我輸入數據庫中已經存在的「測試」,並且點擊除OK按鈕之外的區域時,我得到紅色:「測試已經存在」。到現在爲止還挺好。當我點擊那麼OK buttona帖子完成創建行動,我要求

ModelState.IsValid它總是正確的?

因此,數據被輸入數據庫,我得到一個重複的異常...

我知道這工作之前,我的網站,我只是改變了一些東西,顛覆不是

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

回答

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

在另一個線程(猜哪一個:P),你寫了,我可以覆蓋RemoteAttribute.IsValid是,也適用於我的情況? – Elisabeth

+0

是的,你可以覆蓋它,在這種情況下,ModelState.IsValid將被設置爲正確的值。 –

+0

這樣做的效果是我不需要創建操作中的ReleaseExists調用,但是可能會出現競爭條件,比如用戶在「確定」按鈕上點擊「測試」數據點擊文本框時,我的Create操作可能會更快地被調用比ReleaseExists操作可以返回false。你覺得一樣嗎? – Elisabeth