Wits End with IDictionary <t,t>和ModelBinders,ASP.NET MVC 2.0 </t,t>

时间:2010-10-21 00:19:24

标签: asp.net-mvc

好吧,我不是想做任何超级复杂的事情,我已经搜索过,搜索过,并且漫游每一个我能找到的博客和论坛。我准备撕掉我的头发因为没有人直接显示它的工作。

我想在我的模型中使用IDictionary。没关系,这是无关紧要的。我只是想做一些非常简单的事情,并了解正在发生的事情。

有人可以帮我弄清楚我应该在视图中添加的HTML以使其正常工作吗?请?我已经尝试过Html.TextBoxFor,它在回发时返回null。我已经尝试手动使用字典项的索引,它返回null。我真的很沮丧,我一直看到的是重定向到没有回答问题的博客。

控制器

    public ActionResult DictionaryView()
    {
        var model = new Dictionary<string, int>
        {
            { "First", 0 },
            { "Second", 0 },
            { "Third", 0 },
            { "Fourth", 0 }
        };

        return View(model);
    }

    [HttpPost]
    public ActionResult DictionaryView(Dictionary<string, int> dictionary)
    {
        return null;
    }

HTML

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<System.Collections.Generic.IDictionary<string,int>>" %>

<asp:Content ContentPlaceHolderID="MainContent" runat="server">

    <h2>Dictionary</h2>
<% using (Html.BeginForm()) {%>
        <%: Html.ValidationSummary(true) %>
    <% for (int i = 0; i < Model.Count; i++) { %>
        **// This is there I am stuck!** 
    <% } %>
            <p>
                <input type="submit" value="Submit" />
            </p>
    <% } %>
</asp:Content>

4 个答案:

答案 0 :(得分:3)

http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

实施例

<%
    int i = 0;
    foreach (KeyValuePair<string, int> pair in Model)
    { %>
    <p>Key: <%= Html.TextBox(String.Format("[{0}].key", i), pair.Key)%></p>
    <p>Value: <%= Html.TextBox(String.Format("[{0}].value", i), pair.Value)%></p>
<%
    i++;
    }
%>

编辑:这应该有效

答案 1 :(得分:1)

您可以使用ViewModel(POCO)代替词典吗?这样你的模型就会有你可以选择的东西。

修改


确定。所以没有intellisense我的排骨不完美...对不起。但这是我的总体想法

Public Function DictionaryView() As ActionResult

    Dim model = New System.Collections.Generic.List(Of MyDictionary)
    model.Add(new MyDictionary("First", 0))
    model.Add(new MyDictionary("Second", 0))
    model.Add(new MyDictionary("Third", 0))
    model.Add(new MyDictionary("Forth", 0))

    Return View(model)
End Function


''# This would be your view model.
Public Class MyDictionary
    Public Property TheString
    Public Property TheInt
End Class

然后在您的视图中,您可以使用

model.TheString  
model.TheInt

答案 2 :(得分:1)

与Stacey,

我不相信ModelBinder(无论如何都是默认的),能够弄清楚你想要做什么,因此IDictionary param为null。

您的商品将在Request.Params集合中。例如:

Request.Params["First"]

将返回您在第一个文本框中输入的内容。从那里,你可以手工采摘它们。

如果你想在不使用ViewModel的情况下完成这项工作,建议使用@rockinthesixstring,你很可能必须编写一个可以做你想做的自定义ModelBinder。

如果你需要一个这样的例子,请告诉我,我会挖掘自定义模型粘合剂的东西。

BTW,工作视图可能如下所示:

foreach (var pair in Model)
{
    Response.Write(Html.TextBox(pair.Key, pair.Value));
} 

答案 3 :(得分:1)

你错过了如何拥有一个单独的计数器的概念,所以你有一个索引,并用foreach循环遍历字典:

<% using (Html.BeginForm()) {%>
        <%: Html.ValidationSummary(true) %>
        <% int counter = 0;
           foreach (var kv in Model) { %>
            <input type="text" name="dictionary[<%= counter %>].Key" value="<%= kv.Key %>" />
            <input type="text" name="dictionary[<%= counter %>].Value" value="<%= kv.Value %>" />
        <%
           counter++;
           } %>
        <p>
            <input type="submit" value="Submit" />
        </p>
<% } %>

刚刚测试了这个,我的控制器是你的CCP。

仅供参考我只是阅读那篇博文来到这里。你只需要将你的html元素与Scott发布的内容完全匹配。