2011-11-11 45 views
2

我有一大堆的複選框是用於用戶指定他們希望看到在網格上的列:通過傳遞複選框選擇一個動作

columnselector

目前,每個複選框有它自己的密鑰(這基本上是它的標籤名稱),並宣稱這樣在我看來:

@Html.CheckBox(column.Key, 
       (Request.Form[column.Key] == null ? true : 
       Request.Form[column.Key].Contains("true")), 
       new { @class = "columnSelector" }) 

@Html.Label(column.HeaderText) 

的問題是,我必須讓我的行動從形式收集的值,否則我將不得不有一個每個列選擇器複選框爲0參數。或者,我想我可以將它們命名爲'columnselection'或其他東西,然後將它作爲值的數組傳遞給我的操作,但是由於我沒有列鍵,因此我失去了值的上下文。

我不想爲每個複選框創建具有屬性的視圖模型,因爲此功能在具有不同列的其他屏幕上使用,我想保留它的通用性。

有關如何以乾淨和簡單的方式實現此列選擇的任何想法?

回答

1

Html.CheckBox方法有一個奇怪的實現。複選框將具有唯一的name,本質上是true/false值。這是爲了使該值很容易映射到Action中的bool參數。

正如您明顯注意到的那樣,當您的複選框處於動態狀態時,這會造成棘手的情況。

解決方案是生成您自己的複選框,所有複選框均使用通用的name並且具有唯一的value s。這些將很好地映射到您的操作!

See this question too, for some great examples and explanations

這裏的所需行動:

public ActionResult SetSelectedColumns(string[] selectedColumns) { 
    // selectedColumns will contain the keys of all the checked columns. 
} 

而且這裏是如何讓你的HTML正確映射:

<input type="checkbox" name="selectedColumns" value="@column.Key" @(column.Selected ? "checked='checked'" : "") /> 

我強烈建議把這個功能集成擴展方法,讓你也可以合併ModelStatehtmlAttributes。這是我未經測試的嘗試:

public static HtmlString CheckBoxAlt(this HtmlHelper html, string name, string value, bool selected, object htmlAttributes) 
    { 
     var tag = new TagBuilder("input"); 
     if (htmlAttributes != null) 
      tag.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 
     tag.MergeAttribute("type", "checkbox"); 
     tag.MergeAttribute("name", name); 
     tag.MergeAttribute("value", value); 
     // Determine if this check should be selected: 
     var state = html.ViewData.ModelState[name]; 
     if (state != null) 
     { 
      var values = (string[])state.Value.ConvertTo(typeof(string[])); 
      selected = Array.IndexOf(values, value) != -1; 
     } 
     if (selected) 
      tag.MergeAttribute("checked", "checked"); 

     return new HtmlString(tag.ToString(TagRenderMode.SelfClosing)); 
    } 
+0

是的,這是我現在要走的路。你能詳細闡述你的答案的擴展方法部分嗎? – link664

+0

@ link664我爲你寫了一個擴展方法!享受:) –

+0

謝謝@Scott Rippey,工作就像一個魅力! – link664