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