Jquery Ajax 在 Asp.net MVC Core 中调用传递的参数始终为 null

Jquery Ajax call passed parameter always null in Asp.net MVC Core

我正在将我的 MVC 应用程序迁移到 Asp.Net 核心(3.1 版)应用程序。我有一个用于菜单导航的布局页面。当用户单击任何菜单时,出于某些业务目的,我需要将一些值从 Layout 传递给控制器​​。为此,我在这里使用了一个 ajax 调用。

下面的ajax调用代码在MVC中工作正常,但在Asp.Net核心中,控制器中传递的参数值为null。

MVC的工作代码:

function SetCurrentPageNameSession(currentPageName, isBookMarkPage) {

        if(isBookMarkPage==undefined)
            isBookMarkPage = false;
        var url = baseUrl+"Manage/HighlightCurrentMenu/"
            $.ajax({
            type: "POST",
            data: "{'CurrentPage':'" + currentPageName + "', 'IsBookMark':'" + isBookMarkPage + "'}",
                url: url,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                async:false,
                success: function (data) {
                var res = data.d;
            },
                error: function (xhr, ajaxOptions, thrownError) {

            }
        });
    }

下面是我获取这些传递值的控制器操作方法:

[HttpPost]
        public IActionResult HighlightCurrentMenu(string CurrentPage, bool IsBookMark)
        {
           return Json(true);
        }

当相同的代码在 Asp.Net 核心中不起作用时,我用谷歌搜索了一下,发现需要修改 ajax 调用代码。

我修改了下面的数据部分:

function SetCurrentPageNameSession(CurrentPage, IsBookMark) {

        var url = baseUrl+"Manage/HighlightCurrentMenu/"
            $.ajax({
            type: "POST",
            data: JSON.stringify({ CurrentPage: CurrentPage, IsBookMark: IsBookMark }),
                url: url,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                async:false,
                success: function (data) {
                var res = data.d;
            },
                error: function (xhr, ajaxOptions, thrownError) {

            }
        });
    }

并在控制器操作方法中使用 FromBody:

[HttpPost]
        public IActionResult HighlightCurrentMenu([FromBody] string CurrentPage, [FromBody] bool IsBookMark)
        {
          return Json(true);  
        }

我在“CurrentPage”参数中得到值 null。

下面我自己又尝试了一种情况:

data: JSON.stringify("{'CurrentPage':'" + CurrentPage + "', 'IsBookMark':'" + IsBookMark + "'}"),

在这种情况下,我在操作方法中的“CurrentPage”参数中获得完整的 Json 格式值

下面是相同的屏幕截图。

求推荐。

您可能不需要指定要发送 dataTypejson。我已经尝试了下面的方法并且有效

    function SetCurrentPageNameSession(currentPageName, isBookMarkPage) {
        if(isBookMarkPage==undefined)
            isBookMarkPage = false;
        var url = baseUrl+"Manage/HighlightCurrentMenu/";
        $.ajax({
            type: "POST",
            data: { CurrentPage: currentPageName, IsBookMark: isBookMarkPage },
            url: url,
            success: function (data) {
                var res = data.d;
            },
            error: function (xhr, ajaxOptions, thrownError) {

            }
        });
    }

in Asp.Net core the passed parameter value is null in controller

this doc,你可以找到:

不要将 [FromBody] 应用于每个操作方法的多个参数。输入格式化程序读取请求流后,将无法再读取它以绑定其他 [FromBody] 参数。

要实现从 JS 客户端向控制器操作方法传递多个数据的要求,您可以尝试以下代码片段。

[HttpPost]
public IActionResult HighlightCurrentMenu([FromBody]PageInfo pageInfo)
{
    var currentPage = pageInfo?.CurrentPage;
    var isBookMark = pageInfo?.IsBookMark;

    //...
    //code logic here

    return Json(true);
}

页面信息class

public class PageInfo
{
    public string CurrentPage { get; set; }
    public bool IsBookMark { get; set; }
}

在 JS 客户端

data: JSON.stringify({ "CurrentPage": CurrentPage, "IsBookMark": IsBookMark }),

测试结果

经过 3 小时的努力,这对我有用。

using Microsoft.AspNetCore.Mvc;

namespace NR1003009DynamicNRules.Controllers {
    [Route("api/[controller]")]
    [ApiController]
    public class DynamicNRulesController : Controller {
        [HttpPost("ProcessTextRule")]
        public JsonResult ProcessTextRule([FromBody] Customer customer) {
            var cusName = customer.ContactName;
            return Json("");
        }
    }
    
    public class Customer {
        public string ContactName { get; set; }
    }
}

// Javascript Client
function PostTheRuleToServer() {

    var data = { ContactName: "The customer name" };
    var getWorkflowDetailsUrl = "api/DynamicNRules/ProcessTextRule"

    $.ajax({
        type: "POST",
        url: getWorkflowDetailsUrl,
        data: JSON.stringify(data),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg) {
            alert(msg);
        },
        error: function (req, status, error) {
            alert(error);
        }
    });
}

我尝试删除控制器和操作方法上的属性路由,以下也有效。

using Microsoft.AspNetCore.Mvc;

namespace NR1003009DynamicNRules.Controllers {
    public class DynamicNRulesController : Controller {
        public JsonResult ProcessTextRule([FromBody] Customer customer) {
            var cusName = customer.ContactName;
            return Json("");
        }
    }
    
    public class Customer {
        public string ContactName { get; set; }
    }
}

// Javascript Client. Note the changed url below. 
function PostTheRuleToServer() {
    var data = { ContactName: "The customer name" };
    var getWorkflowDetailsUrl = "DynamicNRules/ProcessTextRule"
    $.ajax({
        type: "POST",
        url: getWorkflowDetailsUrl,
        data: JSON.stringify(data),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg) {
            alert(msg.foo);
        },
        error: function (req, status, error) {
            alert(error);
        }
    });
}