AJAX 发布到 ASP.NET MVC 6 控制器操作方法和参数为空

Posted

技术标签:

【中文标题】AJAX 发布到 ASP.NET MVC 6 控制器操作方法和参数为空【英文标题】:AJAX Post to ASP.NET MVC 6 Controller action method and parameters are null 【发布时间】:2016-05-28 07:15:09 【问题描述】:

我在使用 ASP.NET MVC 并发送 AJAX 帖子时遇到了一个奇怪的问题。我在页面上有一个 ID 为“lnkGetExpirDates”的锚标记。当用户单击它时,我试图简单地将此硬编码数据发送到我的控制器,以便它可以将其用作参数并将结果返回到页面。

但是,在控制器中,参数始终为空/默认值。请在下面查看我的代码,如果我犯了愚蠢的错误或其他什么,请告诉我。

这是我的 AJAX 帖子:

$("#lnkGetExpirDates").click(function () 
    e.preventDefault();

    var data = 
        StartDate: "1/19/2016",
        EndDate: "4/19/2016",
        ProductType: "New",
        Count: 1
    ;


    $.ajax(
        url: '/Products/GetExpirationDates',
        type: 'POST',
        data: JSON.stringify(data),
        contentType: 'application/json; charset=utf-8',
        dataType: 'html',
        success: function (data) 
            $('#ExpirationDates').val(data);
        
    );

);

这是我的控制器的操作方法:

// POST: Product/GetExpirationDates
[HttpPost]
//[ValidateAntiForgeryToken]
public IActionResult GetExpirationDates(GetExpirationDatesViewModel vm)

    // TODO: Get expiration dates and return them in the response

    return View();

这里是 GetExpirationDatesViewModel:

public DateTime StartDate  get; set; 
public DateTime EndDate  get; set; 
public string ProductType  get; set; 
public int Count  get; set; 

请注意,我什至完全没有使用模型,只是简单地向 Action 方法添加参数,例如 startDate、endDate、productType 和 Count,但仍然所有内容都为 null。

【问题讨论】:

【参考方案1】:

当您将内容类型值指定为 application/json 时,向服务器发出的 ajax 请求会将您的 js 对象作为 Request Payload 发送到请求正文中(json 格式)。因此,在您的操作方法中,您应该使用[FromBody] 属性。

public IActionResult GetExpirationDates([FromBody] GetExpirationDatesViewModel vm)

   return View();

当你想发送一个复杂的 js 对象时,你应该这样做,它的属性又是另一个模型/类型

但是您发送的数据是平面视图模型。所以你真的不需要对 js 对象进行 json 字符串化。您也可以删除内容类型属性,并且您不会发送复杂 js 对象的字符串化版本。

这应该可以正常工作。

$.ajax(
    url: '/Products/GetExpirationDates',
    type: 'POST',
    data: data,      
    dataType: 'html',
    success: function (data) 
        console(data);
    
);

上面的代码会将 js 对象作为键值对(普通表单数据)发送,模型绑定器将能够将表单数据映射到服务器中的视图模型对象。更详细的解释请看this post。

我还建议您使用Url.Action 辅助方法来为操作方法生成正确的相对URL。

url: '@Url.Action("GetExpirationDates","Products")',

如果您的 js 代码位于 razor 视图中,上述内容应该可以工作。如果您的代码在外部 js 文件中,请使用this post 中描述的解决方案。

【讨论】:

我真的很感激。它工作得很好。你能向我解释一下什么时候使用 JSON.stringify 是个好主意吗?我假设将整个表单作为 JSON 发布时? 还有一个小问题。假设我最终需要将日期列表返回到网页。我的操作方法中的返回会是什么样子?此外,当我发送诸如 Fri Feb 26 2016 00:00:00 GMT-0500 (东部标准时间)之类的日期作为参数时,它不会接受它,这有点奇怪。我想我只能将其转换为短日期然后发送... 获取更新后的答案。如果要发送日期列表,可以使用 Json() 方法将其作为 JSON 数据返回。在此处查看示例***.com/questions/10608198/… 非常感谢您所做的一切!

以上是关于AJAX 发布到 ASP.NET MVC 6 控制器操作方法和参数为空的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AJAX 将数据发布到 ASP.NET MVC 控制器?

jQuery Ajax POSTing 数组到 ASP.NET MVC 控制器

如何使用 ajax 将文件上传到 asp.net mvc 控制器操作

在 ASP.NET MVC 中使用 AJAX 方法时使用 C# 控制器重定向到页面

为啥通过 jQuery Ajax 将 Plaid 链接结果发布到 ASP.NET MVC 控制器时缺少属性数据?

将多个参数从 ajax post 传递到 asp.net mvc 控制器