2010-12-05 85 views
6

我的控制器操作方法將Dictionary<string, double?>傳遞給視圖。我在我的觀點如下:模型綁定字典

<% foreach (var item in Model.Items) { %> 
<%: Html.Label(item.Key, item.Key)%> 
<%: Html.TextBox(item.Key, item.Value)%> 
<% } %> 

下面是處理POST操作我的操作方法:

[HttpPost] 
public virtual ActionResult MyMethod(Dictionary<string, double?> items) 
{ 
    // do stuff........ 
    return View(); 
} 

當我進入了一些值到文本框,並點擊提交按鈕POST操作方法沒有收回任何物品?我究竟做錯了什麼?

回答

9

我會推薦你​​閱讀this blog post關於如何命名你的輸入字段,以便你可以綁定到字典。所以,你需要一個額外的隱藏字段爲重點:

<input type="hidden" name="items[0].Key" value="key1" /> 
<input type="text" name="items[0].Value" value="15.4" /> 
<input type="hidden" name="items[1].Key" value="key2" /> 
<input type="text" name="items[1].Value" value="17.8" /> 

這可能與沿線的東西產生:

<% var index = 0; %> 
<% foreach (var key in Model.Keys) { %> 
    <%: Html.Hidden("items[" + index + "].Key", key) %> 
    <%: Html.TextBox("items[" + index +"].Value", Model[key]) %> 
    <% index++; %> 
<% } %> 

這是說,我個人會建議您不要使用字典中的觀點。他們是醜陋的,爲了生成模型聯編程序的專有名稱,您需要編寫難看的代碼。我會使用視圖模型。這裏有一個例子:

型號:

public class MyViewModel 
{ 
    public string Key { get; set; } 
    public double? Value { get; set; } 
} 

控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new[] 
     { 
      new MyViewModel { Key = "key1", Value = 15.4 }, 
      new MyViewModel { Key = "key2", Value = 16.1 }, 
      new MyViewModel { Key = "key3", Value = 20 }, 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(IEnumerable<MyViewModel> items) 
    { 
     return View(items); 
    } 
} 

視圖(~/Views/Home/Index.aspx):

<% using (Html.BeginForm()) { %> 
    <%: Html.EditorForModel() %> 
    <input type="submit" value="OK" /> 
<% } %> 

編輯模板(~/Views/Home/EditorTemplates/MyViewModel.ascx):

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<Models.MyViewModel>" %> 
<%: Html.HiddenFor(x => x.Key) %> 
<%: Html.TextBoxFor(x => x.Value) %>