2012-04-24 13 views
0

私の質問に対するDarinの回答に基づいてHo to display multiple checkbox selection based on user's selection from dropdown? 私はドロップダウン選択に基づいて複数のチェックボックスを表示しています。FormCollectionを使用して複数のチェックボックス値を収集するにはどうすればよいですか?

ユーザーが自分のページにあるフォーム(複数の入力を含む)を投稿すると、FormCollectionを使用してすべてのデータを収集します。そして、私が持っている問題は、フォームコレクションから選択したチェックボックスの値をどのように引き出すことができるのですか?チェックボックスの数はドロップダウンとは異なる選択で変わるので、各チェックボックスの値を要求することはできません。

誰でもこの問題を解決できますか?以下に示すように

流れがある:モデル

プロパティ他の形式の入力が存在する実際のビューでPartialView表示

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

<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を使用する方法はありますか?私はCaptchaを実装するためにFormCollectionに変更しました。 – updev

+0

はい、ありますが、 'var flag1 = fc [" BusinessSubCategories [0] .Flag "]'のような恐ろしいコードを書く準備はあります。つまり、決して言わないでください。 FormCollectionを使用しないでください。私はcaptchaとの関係は何か分かりません。追加情報が必要な場合は、適切な名前でビューモデルにプロパティを追加し、コントローラのアクションでこのビューモデルを使用し、FormCollectionを忘れてしまいます。 –

関連する問題