[英]Why passed param with Ajax to controller in ASP.NET Core is always NULL?
[英]ASP.NET Core JSON param always null
我正在嘗試將序列化模型從 ajax 傳遞給我的控制器,但我似乎除了 null 之外什么都沒有。 與其花大量時間討論,我只想展示代碼。
queryDetails 正確地將對象格式化為 { name: val } 格式,但它沒有進入控制器。
Summary.cshtml Javascript 代碼
文件頂部聲明:
var QueryData = ViewData["QueryData"] as QueryModel;
....
在 Js 代碼中:
var queryDetails = @Html.Raw(Json.Serialize(@QueryData));
$.ajax({
type: 'POST',
url: '/Home/SummaryRefresh',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
data: { queryDetails },
success: function () {
},
error: function (error) {
alert(error);
}
});
家庭控制器.cs
[HttpPost]
public IActionResult SummaryRefresh([FromBody] QueryModel queryDetails)
{
// STACKOVERFLOW NOTE: function is hit, but queryDetails is null
if (queryDetails != null)
{
ViewData["QueryData"] = queryDetails;
return View("Summary");
}
else
return BadRequest("Error refreshing view");
}
啟動文件
...
endpoints.MapControllerRoute(
name: "SummaryRefresh",
pattern: "{controller=Home}/{action=SummaryRefresh}/{queryDetails?}");
...
查詢模型.cs
/// <summary>
/// Holds the query data enetered by user
/// </summary>
public class QueryModel
{
/// <summary>
/// Different ways to view summary mode
/// </summary>
public enum SummaryDisplayMode
{
Full,
Quick
}
/// <summary>
/// Current summary view mode
/// </summary>
private SummaryDisplayMode displayMode = SummaryDisplayMode.Full;
/// <summary>
/// Get/Set display mode
/// </summary>
public SummaryDisplayMode DisplayMode { get => displayMode; set => displayMode = value; }
/// <summary>
/// PO Name filter
/// </summary>
[Display(Name = "Product Owner", Prompt = "Name")]
public string POName { get; set; }
/// <summary>
/// Delivery Order Filter
/// </summary>
[Display(Name = "Delivery Order", Prompt = "Example: [removed]")]
public string DeliveryOrder { get; set; }
/// <summary>
/// Port Number filter
/// </summary>
[RegularExpression(@"^PORT-+([0-9]{3}|[0-9]{4}|[0-9]{5})$", ErrorMessage = "[removed]")]
[Display(Name = "[removed]")]
public string PortNumber { get; set; }
/// <summary>
/// Epic Type filter
/// </summary>
[Display(Name = "Epic Type")]
public string EpicType { get; set; }
/// <summary>
/// Program Increment Filter
/// </summary>
[Display(Name = "Program Increment", Prompt = "Example: 20D")]
public string ProgramIncrement { get; set; }
/// <summary>
/// Whether or not to show resolved capabilities
/// </summary>
[Display(Name = "Show Resolved Ports")]
public bool ShowResolved { get; set; }
/// <summary>
/// Whether or not to show backlogs
/// </summary>
[Display(Name = "Show Backlogs")]
public bool ShowBacklogs { get; set; }
/// <summary>
/// Constructor
/// </summary>
public QueryModel()
{
POName = "";
PortNumber = "";
DeliveryOrder = "";
EpicType = "NA";
ShowResolved = true;
ShowBacklogs = false;
}
}
調試的paylod:
displayMode=0&poName=jkeller&deliveryOrder=&portNumber=&epicType=NA&programIncrement=&showResolved=true&showBacklogs=false
這已在 Visual Studio 中進行了測試,並且正在運行
[Route("~/Home/SummaryRefresh")]
public IActionResult SummaryRefresh( QueryModel queryDetails)
ajax應該是這樣的
var queryDetails = @Html.Raw(Json.Serialize(@QueryData));
$.ajax({
type: 'POST',
url: '/Home/SummaryRefresh',
data: { queryDetails:queryDetails },
success: function (result) {
},
error: function (error) {
alert(error);
}
});
解決方案似乎是更換
data: { queryDetails },
和
data: JSON.stringify(queryDetails),
原因是這一行創建了一個對象,而不是 JSON
var queryDetails = @Html.Raw(Json.Serialize(@QueryData));
因此,在執行 POST 之前需要將對象轉換為 JSON。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.