2011-04-15 53 views
3

我正在使用ASP.Net MVC和C#。我有一個模型,它有一個過濾條件的成員。這個成員是IList>。該鍵包含要顯示的值,並且該值指示是否選擇此過濾器。我想將它綁定到我的視圖上的一堆複選框。這是我做到的。將KeyValuePair綁定到複選框

<% for(int i=0;i<Model.customers.filterCriteria.Count;i++) { %> 
<%=Html.CheckBoxFor(Model.customers.filterCriteria[i].value)%>&nbsp; 
<%=Model.customers.filterCriteria[i].key%> 
<% } %> 

這會正確顯示所有複選框。但是,當我提交表單時,在控制器中,無論我選擇什麼視圖,我都會爲篩選標準獲取null。

this我有一個提示創建單獨的屬性。但是,這對IList工作..?有什麼建議嗎?

+0

我錯過了什麼,但它讓我覺得奇怪,你輸出兩個複選框爲每個標準?爲什麼不使用foreach循環? 最後一個問題,你如何在控制器中綁定你的模型?你在使用自動模型綁定還是在檢查表單集合? – WickyNilliams 2011-04-15 12:02:02

+0

@ mr.nicksta:我的錯誤..更正... 我通過在@Page指令中使用Inherits atttribute將我的視圖綁定到控制器。這是你問的嗎? – 2011-04-15 12:05:24

+0

你在說什麼是如何強烈地鍵入你的看法,而我說的是在控制器上的行動,你可以發佈代碼嗎?這將讓你瞭解你是如何試圖從HTTP請求中獲取價值的 – WickyNilliams 2011-04-15 12:23:18

回答

6

KeyValuePair<TKey, TValue>結構的問題是它具有私有setter意味着默認模型聯編程序無法在POST操作中設置它們的值。它有一個特殊的構造函數,需要用來傳遞鍵和值,當然默認的模型綁定器不知道這個構造函數,它使用默認的構造函數,所以除非你爲這種類型寫了一個自定義模型綁定器,將無法使用它。

我會建議你使用自定義類型而不是KeyValuePair<TKey, TValue>

,以便始終我們先從視圖模型:

public class Item 
{ 
    public string Name { get; set; } 
    public bool Value { get; set; } 
} 

public class MyViewModel 
{ 
    public IList<Item> FilterCriteria { get; set; } 
} 

然後控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new MyViewModel 
     { 
      FilterCriteria = new[] 
      { 
       new Item { Name = "Criteria 1", Value = true }, 
       new Item { Name = "Criteria 2", Value = false }, 
       new Item { Name = "Criteria 3", Value = true }, 
      } 
     }); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     // The model will be correctly bound here 
     return View(model); 
    } 
} 

和相應的~/Views/Home/Index.aspx觀點:

<% using (Html.BeginForm()) { %> 
    <%= Html.EditorFor(x => x.FilterCriteria) %> 
    <input type="submit" value="OK" /> 
<% } %> 

,最後我們寫項目類型的定製編輯器模板~/Views/Shared/EditorTemplates/Item.ascx~/Views/Home/EditorTemplates/Item.ascx(如果這個模板是隻有特定的家庭控制器,而不是重複使用):

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.Item>" 
%> 
<%= Html.CheckBoxFor(x => x.Value) %> 
<%= Html.HiddenFor(x => x.Name) %> 
<%= Html.Encode(Model.Name) %> 

我們已經取得了兩件事情:清理從醜陋for循環的看法和提出的模型綁定綁定成功的複選框值POST操作。

+0

謝謝@Darin!我會嘗試這個,讓你知道...現在+1 – 2011-04-17 08:27:08

+0

@達林..實施這個後,我得到了我的看法下面的字符串,而不是複選框..我試圖谷歌,但不能得到線索..任何想法? AutoInternalCustomerSecurityOutboundSystem – 2011-04-18 05:37:26

+0

@Anil Soman,這是一個強烈的跡象表明你的編輯器模板沒有被拾取。發生這種情況是因爲它可能沒有放置在正確的位置或具有正確的名稱。所以你可以在我的例子中看到'FilterCriteria'視圖模型屬性的類型是'IList ',所以編輯器模板是'〜/ Views/Shared/EditorTemplates/Item.ascx'。您可以使用您正在使用的類型的名稱來替換「Item」,但是您需要遵守此約定來獲取模板。 – 2011-04-18 05:44:07