2011-12-12 49 views
1

我想知道是否有人可以指向我的教程或給我一個關於如何驗證模型並通過解析客戶端上的json響應來顯示錯誤消息的想法。我相信這肯定已經被問過了,但是找不到問題。驗證模型解析json響應

0)用戶留下空的必填字段。
1)點擊提交按鈕。
2)該帖子被處理,併發出ajax請求。
3)action方法處理帖子,試圖將模型綁定到表單集合。當必填字段爲空時檢測錯誤。
4)返回一個json響應,傳遞它試圖綁定的對象模型。
5)我想知道如何解析json響應,因此如果我檢測到任何錯誤,比如必填字段,我可以使用生成的數據標記並顯示相應的錯誤消息。

操作方法:

[AcceptVerbs(HttpVerbs.Post)] 
    public JsonResult ValidateTrade(FormCollection data) { 
     Trade addedGroup = new Trade(); 
     try { 
      UpdateModel(addedGroup); 
     } 
     catch (Exception ex) { 
     } return json(addedGroup); 
    } 

的Javascript:

$.ajax({ 
      url: link, 
      type: "POST", 
      data: form.serialize(), 
      success: function (data) { 
//Parse response so if I detect errors, like required field, make use of the data tags already generated by MVC, show the corresponding error message. 
       }, 
       error: function (jqXhr, textStatus, errorThrown) { 
       }, 
       complete: function() { 
       } 
      }); 

這裏是我的.cshtml:

@Html.LabelFor(model => model.Trade.Name) 
@Html.TextBoxFor(model => model.Trade.Name) 
@Html.ValidationMessageFor(model => model.Trade.Name) 

生成的HTML:

<label for="Trade_Name">Name:</label> 
<input class="input-validation-error" data-val="true" data-val-required="Name requiered." id="Trade_Name" name="Trade.Name" type="text" value="" /> 
<span class="field-validation-error" data-valmsg-for="Trade.Name" data-valmsg-replace="true">Name requiered.</span> 

回答

1

查看jQuery Validate插件。它允許您設置自定義規則。您可以分配MVC生成的類以使用插件的驗證方法。

1

MVC有一個RemoteValidator標記,您可以添加其他屬性以發送到服務器進行驗證,但這隻會產生一條驗證消息。

在某個時間點,我試着做你正在建議的事情,即通過AJAX發送數據到服務器,做一些驗證,返回錯誤列表,顯示一些錯誤消息。我如何做到這一點是創建一個自定義對象,我將使用我的所有JSON響應。您可以擴展該對象以包含一個數組或名稱/值對列表,這將允許您識別哪些字段有錯誤。

public class JSONResponseObject 
{ 
    private bool m_Success; 
    private string m_Redirect; 
    private string m_Message; 
    private object m_Data; 

    public bool Success 
    { 
     get { return m_Success; } 
     set { m_Success = value; } 
    } 
    public string Redirect 
    { 
     get { return m_Redirect; } 
     set { m_Redirect = value; } 
    } 
    public string Message 
    { 
     get { return m_Message; } 
     set { m_Message = value; } 
    } 
    public object Data 
    { 
     get { return m_Data; } 
     set { m_Data = value; } 
    } 


    public JSONResponseObject(bool Success) 
    { 
     m_Success = Success; 

     m_Redirect = null; 
     m_Message = null; 
     m_Data = null; 
    } 
    public JSONResponseObject(bool Success, object Data) 
    { 
     m_Success = Success; 
     m_Data = Data; 

     m_Redirect = null; 
     m_Message = null; 
    } 

    public JSONResponseObject(string Redirect) 
    { 
     m_Success = true; 
     m_Redirect = Redirect; 

     m_Message = null; 
     m_Data = null; 
    } 
    public JSONResponseObject(bool Success, string Message) 
    { 
     m_Success = Success; 
     m_Message = Message; 


     m_Redirect = null; 
     m_Data = null; 
    } 
    public JSONResponseObject(bool Success, string Message, object Data) 
    { 
     m_Success = Success; 
     m_Message = Message; 
     m_Data = Data; 

     m_Redirect = null; 
    } 

} 

這可以讓你回傳給客戶端的響應,並檢查屬性:

$.ajax({ 
     type: "POST", 
     dataType: 'json', 
     url: "/woconnect/searchclients", 
     data: "q=" + escape($('#searchTerm').val()) + "&clienttypeid=" + escape($('input[name="clienttypeid"]:checked').val()), 
     success: function(response) { 

      if (response.Success) { 
      //do something with response.Data or response.Redirect 
      } 
      else 
       alert(response.Message); 

      $.unblockUI(); 
     }, 
     error: function() { $.unblockUI(); alert('An error occured and we were unable to load the clients'); } 
    }); 

最大的問題是,你會寫控制器創建之間的依賴內部的驗證控制器和視圖。我不喜歡那樣。我的下一個項目使用MVC的內置客戶端驗證,並使用jQuery.Validate作爲rauland建議。如果設置爲propertly,則可以通過檢查Request.IsAjaxRequest()來使用一個操作來返回完整視圖或部分視圖,甚至可以返回JSON響應。有很多工作要做,我發現驗證構建是最容易使用的。