2010-09-30 83 views
6

我有一個表單,其中也包含一大堆複選框和一些其他類型的控件。我需要檢索每個選中的複選框的名稱。從FormCollection獲取所有選中的複選框

這樣做的最好方法是什麼?我可以用linq查詢來做到嗎?

所以在僞代碼,我希望做這樣的事情:

var names = formCollection 
       .Where(c => c is Checkbox && c.Checked) 
       .Select(c => c.Name); 

更新看來MVC提交複選框的辦法就是從如何規範形式會表現得不同,作爲一個隱藏字段是也呈現。我在這裏找到了詳細信息:How to handle checkboxes in ASP.NET MVC forms?

Anywho,我得到它的工作與該線程的幫助和從BuildStarted下面的答案。下面的代碼做到了這一點。

var additionalItems = form.AllKeys 
     .Where(k => form[k].Contains("true") && k.StartsWith("addItem")) 
       .Select(k => k.Substring(7)); 
+0

感謝您的信息。我通常只是使用內置的模型綁定,並且從來沒有真正看過有關複選框的輸出到html的詳細信息。 – Buildstarted 2010-09-30 15:42:29

回答

5

不幸的是,該類型的信息在該集合中不可用。不過,如果你在前面加上所有的複選框的東西,如<input type='checkbox' name='checkbox_somevalue' />那麼你可以因爲只有選中的值將被調回你不需要驗證,他們正在檢查像

var names = formCollection.AllKeys.Where(c => c.StartsWith("checkbox")); 

運行查詢。

這裏有一個,抓住唯一的檢查值

var names = formCollection.AllKeys.Where(c => c.StartsWith("test") && 
         formCollection.GetValue(c) != null && 
         formCollection.GetValue(c).AttemptedValue == "1"); 
+0

我肯定會收到所有複選框,而不僅僅是選中的複選框。 – fearofawhackplanet 2010-09-30 15:12:47

+0

這很奇怪。快速測試顯示情況並非如此。可能是特定的html造成的。但是''表單似乎不適用於我。不過,我已經更新了答案 – Buildstarted 2010-09-30 15:25:42

+0

我現在明白了。用更多的細節更新我的問題。謝謝你的幫助 :) – fearofawhackplanet 2010-09-30 15:33:35

0

這是不活躍多年的老問題之一,但我無意中發現了它。我的問題是,我有一個複選框 - 讓我們說這個名字是'IsValid',並希望得到每個複選框的狀態(我的項目是在MVC 5中)。在提交表單我做形式收集的循環,並得到了值...

if (key.Contains("IsValid")) 
        sV = (string[])collection.GetValue(key.ToString()).RawValue; 

由於對形式發佈的隱藏字段的值還張貼與檢查複選框;該數組僅包含一個附加值'僅用於檢查複選框的'假'。爲了擺脫我使用以下功能;我希望它能幫助別人,如果我的方法不對,那麼更好的解決方案對我也有幫助!

sV = FixCheckBoxValue(sV); 

     private string[] FixCheckBoxValue(string[] sV) 
    { 
     var iArrayList = new List<string>(sV); 

     for (int i = 0; i < iArrayList.Count; i++) 
     { 
      if (iArrayList[i].ToString() == "true") 
      { 
       iArrayList.RemoveAt(i + 1); 
      }     
     } 
     return iArrayList.ToArray(); 
    } 
相關問題