2012-04-24 80 views
0

基於達林對我的問題的回答Ho to display multiple checkbox selection based on user's selection from dropdown? 我正在顯示基於下拉選擇的多個複選框。如何使用FormCollection收集多個複選框值?

現在,一旦用戶發佈了我的頁面上的表單(具有多個輸入),我就會使用FormCollection收集所有數據。而我所面臨的問題是如何從formcollection中抽取這些選中的複選框值?複選框的數量會隨着下拉菜單的不同選擇而改變,所以我認爲請求每個複選框的值不起作用。

任何人都可以幫助我解決這個問題。

流是如下所示:

性質模型

public class Subcategory 
{ 
    public string Name { get; set; } 
    public int ID { get; set; } 
    public bool Flag { get; set; } 
} 

顯示PartialView在實際視圖,其中其它形式的輸入是存在:

<div id="checkboxlist"> 
     @if (Model.SubCategories != null) 
     { 
      @Html.Partial("SubCategories", Model.SubCategories) 
     } 
</div>  

PartialView SubCategories.cshtml

@model IEnumerable<MyProject.Entities.Subcategory> 
@{ 
// we change the HTML field prefix so that input elements 
// such as checkboxes have correct names in order to be able 
// to POST the values back 
ViewData.TemplateInfo.HtmlFieldPrefix = "checkboxlist"; 
} 
<span>subcategory</span> 
<div id="subcategories" style="margin-left: 130px;margin-top: -20px;" data-role="fieldcontain"> 
    <fieldset data-role="controlgroup"> 
     @Html.EditorForModel() 
    </fieldset> 
</div> 

EditorTemplates Subcategory.cshtml

@model MyProject.Entities.Subcategory 
<div class="editor-label"> 
    @Html.CheckBoxFor(c => c.Flag, new { type = "checkbox" }) 
    <label for="@Model.ID">@Model.Name</label> 
    @Html.HiddenFor(c => c.Flag) 
    @Html.HiddenFor(c => c.ID) 
    @Html.HiddenFor(c => c.Name) 
</div> 

jQuery來基於下拉選擇顯示覆選框:

$('#Category').change(function() { 
    var subcategoriesUrl = $(this).data('subcategoriesurl'); 
    var categoryId = $(this).val(); 
    $('#checkboxlist').load(subcategoriesUrl, { category: categoryId }); 
}); 

回答

1

不要使用FormCollection。這是弱類型。使用視圖模型。就像這樣:

[HttpPost] 
public ActionResult Foo(MyViewModel model) 
{ 
    // model.BusinessSubCategories should contain a list of Subcategory 
    // where for each element you could use the Flag property to see if 
    // it was selected or not 
    ... 
} 

還要注意,你有外地前綴之間的不一致,你正在使用你的部分:和視圖模型集合屬性

ViewData.TemplateInfo.HtmlFieldPrefix = "checkboxlist"; 

Model.BusinessSubCategories。因此,如果您希望默認模型聯編程序能夠在回發時填充此屬性,請確保您修復前綴以使用正確的屬性名稱。

+0

有沒有使用FormCollection的方法?我改爲FormCollection來實現驗證碼。 – updev 2012-04-24 17:25:43

+0

是的,有,但準備編寫可怕的代碼,如:'var flag1 = fc [「BusinessSubCategories [0] .Flag」]''。這就是說:永遠不要那樣做。永遠不要使用FormCollection。我沒有看到與驗證碼有什麼關係。如果您需要一些附加信息,請在您的視圖模型上添加一個屬性,並使用正確的名稱,然後讓您的控制器操作採用此視圖模型並忘記FormCollection。 – 2012-04-24 17:27:43