【发布时间】:2018-03-19 17:36:37
【问题描述】:
我正在尝试通过处理简单的 MVC 项目来熟悉 ASP MVC。
但是有一个问题我想不通。
在某些事件中,AJAX 请求被发送到一个带有 IDictionary 类型参数的操作。
但接收到的参数包含控制器名称、动作名称和语言,而不是 Jquery AJAX 调用中指定的数据。
请看下面的代码。
路由器配置
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Language",
url: "{lang}/{controller}/{action}/{id}",
defaults: new {controller = "Login", action="Index", id=UrlParameter.Optional},
constraints: new {lang = @"en|fr"}
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional, lang = "en" }
);
}
动作
public ActionResult ApproveUsers(IDictionary<string, string> CheckedUsers)
{
return View();
}
jQuery
$('#confirmModal #action').click(function () {
var cb = {};
var data = {};
$("input:checkbox:checked").each(function () {
var key = $(this).attr('value');
var val = $(this).closest('tr').next().find('table').attr('id');
cb[key] = val;
});
$.ajax({
type: "POST",
url: '/AdminHome/ApproveUsers',
dataType: "html",
contentType: 'application/json',
data : JSON.stringify(cb),
success: function (result) {
alert("success");
},
error: function(result) {
alert("failed");
}
});
});
因此,当单击按钮时,所有选中的复选框数据都会作为键值对发送到 ApproveUsers 操作。
但无论Jquery中的cb对象包含什么,ApproveUsers动作中的IDictionary参数都如下所示
[0] {[ contoller, AdminHome ]}
[1] {[ action, ApproveUsers ]}
[2] {[ lang, en]}
这似乎是 RouteConfig 有问题。但我不知道为什么。
如果有人能帮助我了解原因并解决此问题,我将不胜感激。
谢谢,
【问题讨论】:
-
您采取了哪些步骤来验证正在发送的请求是否正在发送您期望它应该发送的数据?
-
为了测试,我在 JQuery 事件中为键和值输入了硬编码字符串,如 cb["firstTestKey"]="firstTestValue" 并且可以通过在操作中放置断点来查看接收到的参数。无论我在 cb 对象中放入什么,参数始终只包含控制器名称、动作名称和语言。
-
您似乎没有命名要传递给控制器的参数。我希望看到类似于
data: {CheckedUsers: cb}的内容 -
dataType: "html"应该是dataType: "json"如果你传递 json -
DefaultModelBinder不适用于Dictionary。使用List<T>其中T包含 2 个string属性以获得您需要的值。 (但至少你需要data : JSON.stringify({ CheckedUsers: cb }),- 并且路由定义没有错)
标签: javascript jquery ajax asp.net-mvc asp.net-ajax