0

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

下面的 ajax 调用代码在 MVC 中运行良好,但在 Asp.Net 核心中,传递的参数值在控制器中为空。

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 格式值

下面是相同的屏幕截图。

附上截图

请建议。

4

3 回答 3

2

在 Asp.Net 核心中,传递的参数值在控制器中为空

从此文档中,您可以找到:

不要[FromBody]对每个操作方法应用多个参数。一旦请求流被输入格式化程序读取,就不能再读取它来绑定其他[FromBody]参数。

为了满足您将多个数据从 JS 客户端传递到控制器操作方法的要求,您可以尝试以下代码片段。

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

    //...
    //code logic here

    return Json(true);
}

页面信息类

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

在 JS 客户端

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

测试结果

在此处输入图像描述

于 2020-09-09T08:43:43.227 回答
2

您可能不需要指定要发送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) {

            }
        });
    }
于 2020-09-09T08:34:45.303 回答
1

经过 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);
        }
    });
}
于 2021-06-11T05:02:36.843 回答