在C#中将字典作为参数传递给Http.Post

时间:2012-05-09 09:46:38

标签: c# asp.net-mvc asp.net-mvc-3 forms razor

我试图将字典传递给Html.Post中的动作方法

Html.BeginForm("ProcessStage2", "Supplier", new {bookVars = Model.BookVars} , FormMethod.Post, new { name = "frmBook" })

我可以传递模型的其他属性(int,string,...)但不能传递Dictionary。有没有机会实现这一目标?因为这本词典有29对,它们似乎太多了,无法分开并将它们分开。

4 个答案:

答案 0 :(得分:3)

您可以使用隐藏字段和编辑器模板。我们来举个例子:

型号:

public class MyViewModel
{
    public IDictionary<string, string> BookVars { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            // fill the dictionary with some dummy data
            BookVars = Enumerable
                .Range(1, 5)
                .ToDictionary(x => "key" + x, x => "value" + x)
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        // the model.BookVars property will be properly bound here
        return View(model);
    }
}

查看(~/Views/Home/Index.cshtml):

@model MyViewModel

@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.BookVars)
    <button type="submit">OK</button>
}

编辑模板(〜/ Views / Home / EditorTemplates / KeyValuePair`2.cshtml):

@model KeyValuePair<string, string>

@Html.Hidden("Key", Model.Key)
@Html.Hidden("Value", Model.Value)

注意编辑器模板的名称,它将自动为字典的每个元素呈现:KeyValuePair`2.cshtml

很抱歉,我无法使用SO的编辑器对其进行正确格式化,但该文件的名称应为:KeyValuePair[grave accent]2.cshtml其中[grave accent]grave accent character

另外,请不要忘记阅读有关集合和字典的wire format,默认模型绑定器希望能够更好地了解正在发生的事情。

答案 1 :(得分:3)

序列化你的字典并将其作为字符串传递(可能是base64编码)。

答案 2 :(得分:2)

不,您不能将对象作为参数传递。唯一的方法是在数据库中存储对象,并传递该对象的POST only id。您应该创建包含该词典的模型:

public int id {get;set;}
public Dictionary<string, int> Dictionary {get;set};

并从服务器端通过id加载它。

答案 3 :(得分:0)

您可以使用例如json序列化来完成此操作。我推荐这个,因为它非常灵活,看起来很优雅。

您的模型可以包含任何对象集。在你的情况下,它是:

public class MyViewModel
{
    public IDictionary<string, string> BookVars { get; set; }
}

在控制器中,您可以根据我们的需要存储一些数据:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        // mock data
        var model = new MyViewModel
                            {BookVars = new Dictionary<string, string> {{"key1", "value1"}, {"key2", "value2"}}};

        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        // the binded model is avaliable
        return View(model);
    }
}

该视图包含一个表单,并包含一个用于ajax提交的自定义脚本。可以以任何方式持久化和修改这些值。您可以使用例如隐藏字段。

@model MyViewModel

<script src="/Scripts/script.js" type="text/javascript"></script>

<script type="text/javascript">
        $(document).ready(function () {
            $('form').frmBookSubmit();
        });
</script>

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { name = "frmBook" }))
{
    <div class="books">
        @foreach (var item in Model.BookVars)
        {
            <input type="hidden" key="@item.Key" value="@item.Value" />        
        }
    </div>
    <input type="submit" />
}

Script.js,使用json序列化数据为ajax提交创建一个简单的jquery插件:

(function ($) {

    $.fn.frmBookSubmit = function () {
        var $this = $(this);
        if ($this != null && $this != 'undefined' && $this.length > 0) {
            $this.submit(function (e) {
                e.preventDefault();

                var myviewmodel = new Object();
                myviewmodel.BookVars = $this.find(".books").booksCollect();
                var data = { model: myviewmodel };
                var jsonString = JSON.stringify(data);

                $.ajax({
                    url: $this.attr("action"),
                    type: 'POST',
                    dataType: 'json',
                    data: jsonString,
                    contentType: 'application/json; charset=utf-8'
                });

            });
        }
    };

    $.fn.booksCollect = function () {
        var books = new Array();
        $(this).find("input").each(function () {
            var k = $(this).attr('key');
            var v = $(this).attr('value');
            var item = {
                Key: k,
                Value: v
            };
            books.push(item);
        });
        return books;
    };

})(jQuery);

如果您觉得它很有用,您也可以使用Newtonsoft.Json库编写自定义json活页夹。

你已经完成了。