使用 jQuery Ajax 将单个对象传递给 MVC 控制器方法

Posted

技术标签:

【中文标题】使用 jQuery Ajax 将单个对象传递给 MVC 控制器方法【英文标题】:Passing A Single Objects Into An MVC Controller Method Using jQuery Ajax 【发布时间】:2019-02-16 20:55:53 【问题描述】:

我正在尝试使用 JQuery 将单个对象数据发布到 MVC 控制器,以下是我的代码。

 //declare of type Object of GroupData
    var GroupData = ;
    //pass each data into the object 
    GroupData.groupName = $('#groupName').val(); 
    GroupData.narration = $('#narration').val();
    GroupData.investmentCode = $('#investmentCode').val();
    GroupData.isNew = isNewItem;
    //send to server
        $.ajax(
            url: "/Admin/SaveContributionInvestGroup",
            type: "POST",
            contentType: "application/json;charset=utf-8",
            dataType: "json", 
            data: JSON.stringify( GroupData: JSON.stringify(GroupData) ),

            success: function (res) 
                alertSuccess("Success", res.Message);

                //hide modal
                $('#product-options').modal('hide');

                hide_waiting();
            ,
            error: function (res) 
                alertError("Error", res.Message);
            
        );

下面是我的控制器。

[HttpPost]
    public JsonResult SaveContributionInvestGroup(ContributionInvestmentGroup GroupData)
    
        ClsResponse response = new ClsResponse();
        ClsContributionInvestmentGroup clsClsContributionInvestmentGroup = new ClsContributionInvestmentGroup();

        var userID = (int)Session["userID"];
        var sessionID = (Session["sessionID"]).ToString();

        if (contributionGroupData != null)
        
            //get the data from the cient that was passed
            ContributionInvestmentGroup objData = new ContributionInvestmentGroup()
            
                contributionInvestmentGroupID = 0,
                groupName = GroupData.groupName,
                narration = GroupData.narration,
                investmentCode = GroupData.investmentCode,
                isNew = GroupData.isNew
            ;

            response = clsClsContributionInvestmentGroup.initiateNewContributionInvestmentGroup(sessionID, objData);
        
        else
        
            response.IsException = true;
            response.IsSucess = false;
            response.Message = "A system exception occurred kindly contact your Administrator.";
        


        return Json(new
        
            response.IsSucess,
            response.Message
        );
    

问题是,数据没有被发送到控制器,控制器接收到一个空对象。 请协助,非常感谢您的努力,谢谢。

【问题讨论】:

您发送的是GroupData,但参数是contributionGroupData。根据您的 C# 类的外观,您也可能不需要该外部结构。 @RoryMcCrossan 我已将它设置为contributionGroupData,但它仍然不起作用...... 它只是 data: GroupData, 并删除 contentType 选项 如果你生成了你正确的视图,那么你只需要var GroupData = $(yourForm).serialize(); 如果您确实使用了contentType: 'application/json(这是不必要的),那么它将是data: JSON.stringify( GroupData: GroupData ),data: JSON.stringify(GroupData); 【参考方案1】:

试试这样:

//send to server
        $.ajax(
             type: "POST",
                url: "/Admin/SaveContributionInvestGroup",
                dataType: "json",
                data:  GroupData,
            success: function (res) 
                alertSuccess("Success", res.Message);

                //hide modal
                $('#product-options').modal('hide');

                hide_waiting();
            ,
            error: function (res) 
                alertError("Error", res.Message);
            
        );

【讨论】:

旁注 - content: "application/json;", 无效 - 它的 contentType - 但幸运的是你有这个错字,因为如果你使用 contentType 它将不起作用 @StephenMuecke 否。我测试过,不适用于contentType 是的,我知道 - 这正是我所说的 - 但是你的代码中有 content: "application/json;",(幸运的是它是无效的并且被忽略了 - 没有名为 content 的 ajax 选项)【参考方案2】:

在您的控制器中,您没有 custom binding 将 JSON 绑定到您的模型,这就是您在参数中获得 null 的原因。 而是将其发布为查询,尝试简单地更改您的 ajax 选项,如下所示:


        ...
        contentType: "application/x-www-form-urlencoded", //default: 
        ..., 
        data: $.param(GroupData),

        ...

也许属性名称区分大小写,因此您需要更改 javascript 模型的名称

【讨论】:

$.param 不是必需的(DefaultModelBinder 不区分大小写)

以上是关于使用 jQuery Ajax 将单个对象传递给 MVC 控制器方法的主要内容,如果未能解决你的问题,请参考以下文章