在我的网站上,我有简单的形式(顺便说一句,我使用 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; }
}
答案 0 :(得分:0)
我的问题的根源与我的预期完全不同。问题出在模型中的属性声明中。而不是:
[Required(ErrorMessageResourceName = "FirstAndSecondNamesRequired")]
我还应该提供我的资源类型:
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "FirstAndSecondNamesRequired")]
修复所有属性后,一切都已按预期开始工作。