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# 控制器重定向到页面