На моем сайте есть простая форма (кстати, я использую бритва просмотр движка):
<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 плагина и не путем явного использования $. Post , и подготовка данных для отправки вручную.
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._%+-]+@[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; }
}