2010-10-28 38 views
0

在我的地盤我有簡單的形式(順便說一下我使用剃刀視圖引擎):反序列化的問題,同時發佈的數據(jQuery的,JSON,MVC)

<form method="post" action="Mail/SendMailMessage" id="mailForm"> 
    @Html.LabelFor(m => m.UserFirstAndSecondName)<br /> 
    @Html.TextBoxFor(m => m.UserFirstAndSecondName)<br /> 
    @Html.LabelFor(m => m.Email)<br /> 
    @Html.TextBoxFor(m => m.Email)<br /> 
    @Html.LabelFor(m => m.Content)<br /> 
    @Html.TextAreaFor(m => m.Content, new { cols = "40%", rows = "5%" })<br /> 
    <input type="submit" value="Send"> 
</form> 

對於這種形式的工作,我使用jquery.form.js插件:

$(document).ready(function() { 
    var options = { 
     beforeSubmit: showRequest, // pre-submit callback 
     success: showResponse // post-submit callback 
    }; 
    $('#mailForm').ajaxForm(options); 
}); 

當表單各個領域充滿我提交表單,一切都很好。調用控制器的操作:

[HttpPost] 
    public JsonResult SendMailMessage(MailModel model) 
    { 
    //... 
    return Json(new MailModel()); 
    } 

並返回響應。

但如果不填充表格上的任何領域,控制器動作不會被調用,我被退回這是未定義的對象:

function showResponse(responseData, statusText, xhr, $form) { 
    setUpMailForm(responseData); // undefined responseData 
} 

我想這jQuery插件是不是發送空表單字段,而這就是解密的問題。如何使它正確地將表單字段反序列化爲MailModel對象,並調用控制器動作,即使表單中的某些字段爲空?

如何使這項工作?

PS。我想用這個jquery.form.js插件,而不是通過$。員額明確的使用情況,並準備數據手動發送去做。

UPDATE

我錯了。我調試了jquery.plugin.js,並且每個字段名的值(空或不)都被傳遞到查詢字符串中。

下面我把模型類:

public class MailModel 
    { 
     [Required(ErrorMessageResourceName = "FirstAndSecondNamesRequired")] 
     [StringLength(150, MinimumLength = 1, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "UserFirstAndSecondNameLenghtError")] 
     [Display(ResourceType = typeof(Resources), Name = "UserFirstAndSecondName")] 
     public string UserFirstAndSecondName { get; set; } 

     [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "EmailRequired")] 
     [StringLength(100, MinimumLength = 1, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "EmailLenghtError")] 
     [RegularExpression(@"^[a-zA-Z0-9._%+-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "EmailRegexError")] 
     [Display(ResourceType = typeof(Resources), Name = "Email")] 
     public string Email { get; set; } 

     [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ContentRequired")] 
     [StringLength(1000, MinimumLength = 1, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ContentLenghtError")] 
     [Display(ResourceType = typeof(Resources), Name = "Content")] 
     public string Content { get; set; }  
    } 

回答

0

我的問題的根源是比我預想的完全不同。問題在於模型中的屬性聲明。相反的:

[Required(ErrorMessageResourceName = "FirstAndSecondNamesRequired")] 

我也應該把我的資源類型:

[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "FirstAndSecondNamesRequired")] 

固定所有屬性後,一切都已經開始按預期運行。