将字典传递给控制器 asp.net mvc
Posted
技术标签:
【中文标题】将字典传递给控制器 asp.net mvc【英文标题】:pass dictionary to controller asp.net mvc 【发布时间】:2011-01-01 06:06:25 【问题描述】:我想通过 Ajax 帖子将 <int,int>
类型的字典传递给我的控制器。
这里的主要原因是帖子在这里可能有 1-3 个键值对(这些值在编译时都不知道),将来可能会增加到 5 个。
在帖子中我还必须传入一些其他数据,例如 ID 和名称,这些都正常工作。
我将如何在 javascript 中构建这个字典,然后通过 JQuery 帖子发送它,最后在控制器上接收它进行处理?
编辑 2: 我决定只用每个值的帖子来解决这个问题,而不是尝试传递字典。
编辑: 这是我的函数来源,因此您可以看到我正在尝试的内容:
function BindAddMenuItem()
$(".AddMenuItem").click(function (e)
e.preventDefault();
//get header id from link by removing addmenuitem from this.id
var currentId = $(this).attr("id").replace("AddMenuItem", "");
//get itemnumber, itemname, itemdetails from textboxes with same header id
var restaurantId = jQuery.trim($("#RestaurantId").val());
var itemNumber = jQuery.trim($("#ItemNumber" + currentId).val());
var itemName = jQuery.trim($("#ItemName" + currentId).val());
var itemDetails = jQuery.trim($("#ItemDetails" + currentId).val());
var costs = new Object();
//select all textboxes with class "Header" + currentId
$(".Header" + currentId).each(function (i)
var optionId = $(this).attr("id").replace("Option", "");
costs[optionId] = $(this).val();
);
$.ajax(
type: "POST",
url: "/Menu/AddMenuItem",
data: "reastaurantId=" + restaurantId + "&menuHeaderId=" + currentId + "&itemNumber=" + itemNumber + "&itemName=" + itemName + "&itemDetails=" + itemDetails + "&costs=" + costs,
dataType: "html",
success: function (result)
var domElement = $(result);
$("#MenuContainer").replaceWith(domElement);
var newNum = parseInt(itemNumber) + 1;
$("#ItemNumber" + currentId).val(newNum);
BindAllBehaviours();
);
);
【问题讨论】:
【参考方案1】:类似(javascript)的东西
dict = new Object();
dict['12'] = 5;
dict['13'] = 6;
dict['1000'] = 21;
dict['9'] = 13;
dict['13'] = 48;
$.post('/client.mvc/mypostaction/', myDictionary: dict );
然后您可以使用Dictionary<int, int>
作为属性类型将dict
对象发布到您的控制器。
ActionResult MyPostAction(Dictionary<string, int> myDictionary)
第二次从作者的代码中编辑:
当有Dictionary<string, int> kvPairs
时,以下内容对我有用。 <int, int>
毕竟是行不通的。
让你的帖子像:
var dict = new Object();
dict['13'] = 9;
dict['14'] = 10;
dict['2'] = 5;
$.post('controller.mvc/Test', 'kvPairs': dict , function(obj) $('#output').html(obj.Count); );
【讨论】:
当像你这样传递字典时,我建议我得到一个空对象。我已经更新了我的问题以显示我的来源。谢谢 我现在已经尝试将字典作为字符串,整数和字符串,字符串。将帖子更改为您列出的方式,但它仍然没有显示任何值。感谢你目前的帮助。我真的不知道还有什么方法可以让这个工作 检查我的编辑。你用'
包围了字典项吗?
@JanJongboom ,它对我也不起作用,它没有找到方法。【参考方案2】:
当需要Dictionary<TKey, TValue>
时,JavaScript 对象/字典必须作为键值对列表传递给 ASP.NET MVC 控制器。示例:
如果你有这样的字典:
public Dictionary<string, decimal?> SomeMapping get; set;
那么你必须在你的 JavaScript 中使用这样的东西:
var sourceMapping = a: 1, b: 1.5, c: null ;
var SomeMapping = [];
for (var key in sourceMapping)
if (sourceMapping.hasOwnProperty(key))
SomeMapping.push( Key: key, Value: sourceMapping[key] );
我在内容类型设置为 'application/json'
的异步 POST 请求(使用 jQuery 发送)中使用了这种方法(这在您的情况下可能很重要,也可能不重要)。
【讨论】:
我都试过了。但只有你的解决方案有效。所以 +1 给你【参考方案3】:客户端(JavaScript):
var dict = new Object();
dict.Key1 = "Value1"
dict.Key2 = "Value2"
$.post('/YourController/YourAction/', dict);
注意:“dict”对象在发送到您的操作之前会在幕后序列化。
服务器:
public ActionResult YourAction()
string postData = string.Empty;
using (StreamReader sr = new StreamReader(Request.InputStream))
postData = sr.ReadToEnd();
//Load post data into JObject (Newtonsoft.Json)
JObject o = JObject.Parse(postData);
//Extract each key/val
string val1 = (string)o["Key1"];
//Do whatever....
【讨论】:
你能写get请求吗?我想在 chrome 的 PostMan 插件中测试它,所以我需要将我的参数传递给 dict 参数【参考方案4】:除了mczers 之外,这些对我都不起作用,但他没有显示所有步骤,并且当您试图记住如何设置 ajax 请求时会变得很困难。所以我想把所有真正有效的东西都放进去。首先,在 JavaScript 中:
var validDict = new Array();
validDict[0] = key: 1, value: 4
validDict[1] = key: 42, value: 5
var path = "@Url.Action("ControllerName", "ActionName")";
$.ajax(
url: path,
type: "POST",
data: JSON.stringify(validDict),
contentType: "application/json; charset=utf-8",
async:false,
success: function(status, xhr)
alert(status);
,
error: function(xhr, status, error)
alert(error);
);
然后在你的控制器中:
[HttpPost]
public ActionResult ActionName(Dictionary<int, int> validDict)
// doStuff();
return Content("Success");
【讨论】:
【参考方案5】:IDictionary
"Key1": "Value1", "Key2": "Value2"
在 ASP.NET Web API 中的服务器端
[HttpPost]
public IHttpActionResult([FromBody]IDictionary<string, string> requestParam)
上面的例子是一个 Http POST,其中 Json 数据在 Body 中
【讨论】:
以上是关于将字典传递给控制器 asp.net mvc的主要内容,如果未能解决你的问题,请参考以下文章
模型在使用 C# 将 POST 方法作为参数传递给 ASP.NET MVC 中同一控制器的 GET 方法时获取 NULL
ASP .NET MVC Redirecttoaction 将参数传递给 Index 但值为空
如何将多个参数传递给 ASP.NET Core 中的 get 方法