如何在隐藏字段中存储Dictionary <string,string =“”>并通过FormCollection Id </string,>在控制器中检索它

时间:2014-04-14 14:13:05

标签: asp.net-mvc asp.net-mvc-4

情景是: -

控制器部分:

    public ActionResult GoHt()
    {
        Dictionary<string, string> col = new Dictionary<string, string>();
        col.Add("A", "C");
        col.Add("B", "C");
        ViewBag.Cols = col;
        return View();
    }

查看部分:

    <input type="hidden" id="HD" name ="HD" value="@ViewBag.Cols" />

在这种情况下,隐藏值不显示哪个id定义的Dictionary元素,而是显示为

    <input type="hidden" id="HD" name="HD"  value="System.Collections.Generic.Dictionary`2[System.String,System.String]">

这里的问题是,如何将Dictionary元素分配给ViewBag并存储在隐藏字段中。

以及如何在表格提交中提供相同的词典。

控制器:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult GoHt(FormCollection formCollection)
    {

        var Mode = (Dictionary<string, string>)formCollection["HD"].ToString();
    }

2 个答案:

答案 0 :(得分:2)

对于字典中的每个键,您将需要多个隐藏字段。 Scott Hanselman写了一篇很好的blog post来解释你的隐藏字段应该如何命名。这样,您就可以在控制器中将值检索为强类型的Dictionary对象。

<input type="text" name="col[0].Key" value="A" />
<input type="text" name="col[0].Value" value="C" />
<input type="text" name="col[1].Key" value="B" />
<input type="text" name="col[1].Value" value="C" />
...

现在您的控制器操作可以直接将字典作为参数:

[HttpPost]
public ActionResult GoHt(Dictionary<string, string> col)
{
    // do something with col here ...
}

所以现在剩下的就是遍历字典的值并生成隐藏的字段:

@foreach (var item in (Dictionary<string, string>)ViewBag.Cols)
{
    @Html.Hidden("cols.Key", item.Key)
    @Html.Hidden("cols.Value", item.Value)
}

答案 1 :(得分:0)

在Controller部分中您可以编写相同的代码。

     public ActionResult GoHt()
     {
     Dictionary<string, string> col = new Dictionary<string, string>();
     col.Add("A", "C");
     col.Add("B", "C");
     ViewBag.Cols = col;
     return View();
     }

在“查看”页面中,您需要将您的视包数据重新分配给Temp数据,如此

    @{

    TempData["Dict"] = ViewBag.Cols; 
    }

现在,在表单提交上,您可以检索像这样的字典值

    public ActionResult GoHt(FormCollection formCollection)
    {
    Dictionary<string, string> obj = (Dictionary<string, string>)TempData["Dict"];
    }