将字典传递给控制器​​asp.net mvc

时间:2010-01-04 13:26:01

标签: c# javascript asp.net-mvc ajax dictionary

我想通过Ajax帖子将类型<int,int>的字典传递给我的控制器。 这里的主要原因是这里的帖子可能有1-3个键值对(这些值在编译时都不知道),将来它可能会达到5个。

同样在帖子中我必须传递一些其他数据,例如Id和name,这些数据都正常。

我如何在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();
                }
            });
        });

    }

4 个答案:

答案 0 :(得分:19)

像(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 });

然后,您可以使用dict作为属性类型将Dictionary<int, int>对象发布到您的控制器。

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); }); 

答案 1 :(得分:14)

当期望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] });
    }
}

我在异步POST请求(使用jQuery发送)中使用了这种方法,内容类型设置为'application/json'(在您的情况下这可能重要也可能不重要)。

答案 2 :(得分:1)

客户端(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....
}

答案 3 :(得分:0)

除了 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");
        }