1

我有一个我喜欢提交的表格jQuery Ajax。我的Ajax功能类似于以下代码:

   $('#submitForm').click(function (e) {
        e.preventDefault();

        $.ajax({
            url: '/Letter/Create',
            type: 'post',
            data: {
                letterViewModel: $('#letterForm').serialize(),
                relatedLetters: JSON.stringify(relatedLetterList)
            },
            success: function (result) {
                alert('success ' + result);
            },
            error: function () {
                alert('error');
            }
        });
    });

我的行动是:

    [HttpPost]
    public virtual ActionResult Create(LetterViewModel letterViewModel, string relatedLetters)
    {
        .
        .
        .
    }

问题来了,Action方法的第一个参数总是null. 我不知道是什么问题,任何建议都会有所帮助。

更新:序列化后的数据:

__RequestVerificationToken=goQJDz5BCMx9NCJAZ3yuMA2E-WRgL9pJvavkLhF27epxkz3bRO_t-ADNhGHslHjXifLuxmFQcJBuOkMBSqMlFjkfKjVK-hGgY-nvRmp_2i81&CategoryId=1&LetterTitle=456&Exporter=465&ArchivePlace=456&OrgLetterNumber=456&OrgLetterDate_fa=1392%2F02%2F02&IndicatorNumber=456456&IndicatorDate_fa=1392%2F02%2F09&RelatedLetterId=3

我的LetterViewModel

public class LetterViewModel
{
    public Int32 LetterId { get; set; }

    public Int32 RelatedLetterId { get; set; }

    public Int32 ServiceUserId { get; set; }

    public Int32 CategoryId { get; set; }

    public String LetterTitle { get; set; }

    public DateTime OrgLetterDate { get; set; }

    public String OrgLetterNumber { get; set; }

    public DateTime IndicatorDate { get; set; }

    public String IndicatorNumber { get; set; }

    public String ArchivePlace { get; set; }

    public Boolean HasAppendix { get; set; }

    public Int32 PageCount { get; set; }

    public String Exporter { get; set; }

    public String OrgLetterDate_fa { get; set; }

    public String IndicatorDate_fa { get; set; }

    public List<CategoryViewModel> CategoryViewModels { get; set; }

    public List<VwLetterViewModel> RelatedLetters { get; set; }
}
4

2 回答 2

1

我之前在使用控制器和 POST 数据时遇到过这个问题,因为它在发送变量时与 GET 不同,您需要以 JSON 格式发送数据,例如:

$('#submitForm').click(function (e) {
    e.preventDefault();

    var data = {
        letterViewModel: $('#letterForm').serialize(),
        relatedLetters: relatedLetterList // don't need to stringify this as it's done in JSON.stringify below
    }

    var obj = JSON.stringify(data);

    $.ajax({
        url: '/Letter/Create',
        type: 'post',
        data: obj,
        success: function (result) {
            alert('success ' + result);
        },
        error: function () {
            alert('error');
        }
    });
});
于 2013-05-13T13:38:37.180 回答
1

问题在这里:

data: {
    letterViewModel: $('#letterForm').serialize(),
    relatedLetters: JSON.stringify(relatedLetterList)
},

.serialize()方法已经执行了application/x-www-form-urlencoded数据的序列化,而 jQuery 数据执行了另一个序列化,因此您最终会收到无效请求。

您可以在您的表单中包含一个隐藏字段#letterForm并在发布表单之前立即设置其值:

$('#letterForm').submit(function (e) {
    e.preventDefault();

    // set the value of the hidden field to the corresponding JSON
    $('#relatedLetters').val(JSON.stringify(relatedLetterList));

    $.ajax({
        url: this.action,
        type: this.method,
        data: $(this).serialize(),
        success: function (result) {
            alert('success ' + result);
        },
        error: function () {
            alert('error');
        }
    });
});

另请注意,我使用了表单的 .submit 事件,而不是提交按钮的 .click 事件。这样做的原因是可以通过其他方式提交表单,而不仅仅是用鼠标单击提交按钮。例如,考虑用户Enter在某些 iof 表单字段中按下键。这将提交表单,如果您订阅提交按钮的单击事件,您的 AJAX 请求将永远不会触发。

于 2013-05-13T13:51:18.283 回答