好吧,我不是想做任何超级复杂的事情,我已经搜索过,搜索过,并且漫游每一个我能找到的博客和论坛。我准备撕掉我的头发因为没有人直接显示它的工作。
我想在我的模型中使用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;
}
<%@ 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>
答案 0 :(得分:3)
实施例
<%
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发布的内容完全匹配。