发布数据时的反序列化问题(jQuery,json,mvc)

时间:2010-10-28 11:05:09

标签: jquery asp.net-mvc json jquery-plugins

在我的网站上,我有简单的形式(顺便说一句,我使用 razor 视图引擎):

<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 ,并准备手动发送数据。

更新

我错了。我调试了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 :(得分:0)

我的问题的根源与我的预期完全不同。问题出在模型中的属性声明中。而不是:

[Required(ErrorMessageResourceName = "FirstAndSecondNamesRequired")]

我还应该提供我的资源类型:

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

修复所有属性后,一切都已按预期开始工作。