Проблема десериализации при публикации данных (jQuery, json, mvc) - PullRequest
0 голосов
/ 28 октября 2010

На моем сайте есть простая форма (кстати, я использую бритва просмотр движка):

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

1 Ответ

0 голосов
/ 29 октября 2010

Источник моей проблемы совершенно другой, чем я ожидал.Проблема заключается в объявлении атрибута в модели.Вместо:

[Required(ErrorMessageResourceName = "FirstAndSecondNamesRequired")]

Я должен также указать тип своего ресурса:

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

После исправления всех атрибутов все стало работать как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...