2010-08-04 26 views
2

我的AddressEditViewModel具有標記爲[Required(ErrorMessage="My Error Message Here")]和/或[DisplayName("etc")]的一組屬性。顯示名稱屬性工作:如何驗證jQuery對話框中的ViewModel?

<%: Html.LabelFor(model => model.Field) %> 

,我認爲所需要的屬性是工作壓力太大,但我不知道如何提供表單(jQuery UI的對話框)反饋。這種形式是通過$阿賈克斯()提交,並在操作方法:

[HttpPost] 
    public ActionResult Edit(AddressEditViewModel address) 
    { 
     var addressToEdit = dc.Addresses.FirstOrDefault(x => x.AddressID == address.AddressIDEdit); 

     if (ModelState.IsValid) 
     { 
      //make sure there is at least one active address 
      if (!address.ActiveEdit && (addressToEdit != null && addressToEdit.Active)) 
      { 
       if (dc.Addresses.Where(x => x.ProfileID == addressToEdit.ProfileID).Count(x => x.Active) == 1) 
       { 
        address.ActiveEdit = true; 
       } 
      } 

      try 
      { 
       //TryUpdateModel SUCKS!~ 
       //use valueinjecter 
       addressToEdit.InjectFrom<VMToAddress>(address); 

       dc.SubmitChanges(); 
      } 
      catch (Exception) 
      { 
       return View(address); 
      } 
     } 
     else 
     { 
      return View(address); //activate the red borders around textboxes 
     } 

     return Content("Ok"); 
    } 

而且小類ValueInjecter:

public class VMToAddress : LoopValueInjection 
{ 
    protected override string TargetPropName(string sourcePropName) 
    { 
     if (sourcePropName.EndsWith("Edit")) 
     { 
      return sourcePropName.RemoveSuffix("Edit"); 
     } 
     else if (sourcePropName.EndsWith("Create")) 
     { 
      return sourcePropName.RemoveSuffix("Create"); 
     } 
     else 
     { 
      return sourcePropName; 
     } 
    } 
} 

ModelState.IsValid返回true,即使address.RequiredField爲空。 SubmitChanges()拋出一個SqlException,因爲它不能插入NULL值。我不理解如何使用ModelState,或者是否有其他方式提供有關無效字段的反饋?我想在我的文本框周圍設置一個紅色邊框,例如我在許多MVC教程中看到的模型驗證,或者可以從ViewModel顯示我的ErrorMessage值。

另一個編輯

刪除jQuery.validate並創建了一個客戶模型綁定,以適應常用命名的元素。自定義模型聯編程序現在甚至添加了驗證消息(所以我刪除了Html.ValidationMessageFor(...)調用,因爲我不需要它們 - 只是邊界)。

但是,在Omu建議使用jQuery.form插件時,我的模型在第一次回發後似乎丟失了。 closeEditForm只是檢查返回Content("Ok"),關閉編輯對話框並最終刷新列表對話框。但是,錯誤發生後,它正確地不關閉對話框,給我紅色的邊框(hooray),但在後續的帖子裏有沒有模型(boo)傳遞給我的活頁夾 - 只是空值。

$('#editform').submit(function() { 
    $(this).ajaxSubmit({ 
     target: '#editform', //this will allow validation classes to be added, etc 
     success: closeEditForm //this will close the edit form if the response text is "Ok" 
    }); 
    return false; 
}); 

我提交表單是這樣的:

$("#dialog-address-edit").dialog({ 
      ...lots of dialog settings 
      buttons: { 
       'Save': function() { 
        $('#editform').submit(); 
+0

你正在檢查你的ModelState罰款,但你可以檢查調試器中的地址對象(在你的行動方法)什麼?您可能在序列化/ AJAX發佈時遇到問題。另外,如果你使用「經典」POST(沒有jQuery),它是否工作? – mare 2010-08-04 22:47:57

+0

我還沒有序列化(目前我的$ .ajax()調用使用'data:「addressid =」+ $('#AddressID-Edit').val()+ ...'so so address' contains我期望的空字段和'addressToEdit'包含原始值。我不認爲它會使用常規POST,因爲我的字段ID是字段名** - 編輯**。這不需要某種額外的映射嗎? – 2010-08-05 15:13:14

+0

當你得到驗證錯誤,並將html發送回瀏覽器時,你將它設置爲div,並且你必須再次註冊所有內容,$(editform).submit(),validate,..你在裏面的任何東西 – Omu 2010-08-12 06:21:46

回答

2

我會建議你使用jquery.form插件,並在行動,如果ModelState中好返回的內容(「OK」),否則你返回查看(yourViewModel),在客戶端你看看如果響應是好的你關閉對話框,否則你填寫它的響應(這是html)

你可以看看這裏:http://surveymaster.codeplex.com/我做了很多Ajax與jQuery 。在這個項目中, 雖然我沒有在ajax reponse中使用返回html的東西因爲它沒有必要那裏

+0

我想我使用jQuery.validate工作,但我的問題是ModelState.IsValid **總是**似乎是真的 - 無論輸入無效,我認爲ModelState與我的模型沒有關係,等等...我使用AddressEditViewModel呈現Edit View,Update Action接受Address, - 這是嗎? – 2010-08-05 21:48:53

+0

好吧,我想我現在,你有'更新(地址地址)',但你應該有'更新(AddressViewModel地址)'而不是 – Omu 2010-08-06 03:14:03

+0

當我使用'AddressEditViewModel'時,帖子不拿起由AddressID-Edit的id形式的隱藏字段。當我使用viewmodels時,在html中的每個輸入都應該在視圖模型中有一個屬性,並且它應該可以工作 – 2010-08-06 19:22:56