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 格式值
下面是相同的屏幕截图。
求推荐。
您可能不需要指定要发送 dataType
个 json
。我已经尝试了下面的方法并且有效
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);
}
});
}
我正在将我的 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 格式值
下面是相同的屏幕截图。
求推荐。
您可能不需要指定要发送 dataType
个 json
。我已经尝试了下面的方法并且有效
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);
}
});
}