Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用jQuery序列化的数据不会发布到操作方法_C#_Jquery_Ajax_Asp.net Mvc - Fatal编程技术网

C# 使用jQuery序列化的数据不会发布到操作方法

C# 使用jQuery序列化的数据不会发布到操作方法,c#,jquery,ajax,asp.net-mvc,C#,Jquery,Ajax,Asp.net Mvc,我有一个表单,我希望与jQueryAjax一起提交。我的Ajax函数类似于以下代码: $('#submitForm').click(function (e) { e.preventDefault(); $.ajax({ url: '/Letter/Create', type: 'post', data: { letterViewModel: $('#le

我有一个表单,我希望与
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\u t-adnhghslhjxifluxfqcjbuokmbsqmlfjkfkjvk-hGgY-nvRmp\u 2i81&CategoryId=1&LetterTitle=456&Exporter=465&ArchivePlace=456&OrgLetterNumber=456&OrgLetterDate\fa=1392%2F02%2F02&IndicatorNumber=456456&IndicatorAtate=1392%2F02%LetterId=2F09

和我的
莱特视图模型

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; }
}
公共类LetterViewModel
{
public Int32 LetterId{get;set;}
公共Int32 RelatedLetterId{get;set;}
公共Int32 ServiceUserId{get;set;}
公共Int32类别ID{get;set;}
公共字符串LetterTitle{get;set;}
公共日期时间OrgLetterDate{get;set;}
公共字符串OrgLetterNumber{get;set;}
公共日期时间指示符日期{get;set;}
公共字符串指示符编号{get;set;}
公共字符串ArchivePlace{get;set;}
公共布尔值{get;set;}
公共Int32页面计数{get;set;}
公共字符串导出器{get;set;}
公共字符串OrgLetterDate_fa{get;set;}
公共字符串指示符日期{get;set;}
公共列表类别视图模型{get;set;}
公共列表相关字母{get;set;}
}

我以前在控制器和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');
        }
    });
});
问题在于:

data: {
    letterViewModel: $('#letterForm').serialize(),
    relatedLetters: JSON.stringify(relatedLetterList)
},
.serialize()
方法已经对数据执行了
应用程序/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事件,而不是submit按钮的.click事件。原因是表单可以通过其他方式提交,而不仅仅是用鼠标单击提交按钮。例如,假设用户在表单字段的某些iof中按下Enter键。这将提交表单,如果您订阅了submit按钮的click事件,您的AJAX请求将永远不会触发。

alert($(“#letterForm”).serialize()给了您什么?我检查过了,它序列化表单,但在action方法中它为null。请另外显示
lettViewModel
的类声明。在操作中
null
的模型通常意味着类声明和接收的数据不匹配。使用jQuery序列化数据会创建一个查询字符串,该查询字符串通常由服务器解释并解析为数组或类似的内容,但是当您发送一个对象,其中一个属性是带有序列化字符串的键时,这种情况不会发生,相反,jQuery会序列化包含已序列化字符串的对象。您是否尝试将
.serialize()
替换为
.serializeArray()
?没有$.toJSON方法,这对我来说没有多大意义?这是我使用的,但在一个单独的库中,改为JSON.stringify。这对我来说是有效的,我已经多次遇到相同的问题。@ChrisDixon谢谢你的回复,我已经尝试过了,但是这次第二个参数relatedLetter是空的。那么第一个参数现在可以了?然后也尝试对relatedLetterList进行stringify,看看这是否有区别(我不知道你的JS数据模型是什么)。记住relatedLetterList在你的控制器中是一个字符串,确保这是你发送的内容的适当类型……你能不能也将它添加到字符串:
$('#letterForm')。serialize()+'&relatedLetters='+JSON.stringify(relatedLetterList)
是的,这也可以工作,只要确保使用此字符串连接以确保正确编码时,
encodeURIComponent
值。是否确保隐藏字段的
name
relatedLetters
?另外,通过使用FireBug检查AJAX请求,确保在该参数中发送了相应的JSON值。POST中没有序列化relatedLetters的迹象,只有我的第一个参数数据。那么您的表单可能不包含具有该名称的隐藏字段。确保它包含一个