簡體   English   中英

ASP.NET Core JSON 參數始終為空

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM