私はerichynds Multi Select Widgetを使用して、MultiSelectList の素敵なスタイルを作成しています。しかし、私の問題は (どうやら) 無関係のようです。
DemographicQuestionFilter
各質問をループして、応答をリストし、選択したアイテムをモデルDemographicResponseFilter
とともに取得/投稿できるようにしています。DemographicFilterViewModel
私が抱えている問題は、リスト内のアイテム 1 (インデックス 0) のフィルターを設定すると正常に機能し、アイテム 2 (インデックス 1) を設定するとアイテム 1 も設定されている場合にのみ機能することです。 -1 が設定されていない場合、DemographicFilters
オブジェクトは null です。タイプを切り替えることができるか、ここで基本的なものが欠けていると思います。
n Question で選択された項目を含むリストが、選択された項目を持つ n-1 に依存しないようにするにはどうすればよいですか?
ここに私の ViewModel オブジェクトがあります:
親:
public class DemographicFilterViewModel
{
public int TaskID { get; set; }
public List<DemographicQuestionFilter> DemographicFilters { get; set; }
}
子:
public class DemographicQuestionFilter
{
public string Question { get; set; }
public List<DemographicResponseFilter> Responses { get; set; }
public List<SelectListItem> selectListItems { get; set; }
public List<int> SelectedItems { get; set; }
}
孫:
public class DemographicResponseFilter
{
public int ResponseID { get; set; }
public string Response { get; set; }
}
意見:
@Html.HiddenFor(m => m.TaskID)
if (Model.DemographicFilters != null)
{
for (int i = 0; i < Model.DemographicFilters.Count; i++)
{
@Html.HiddenFor(model => model.DemographicFilters[i].SelectedItems)
@Html.DisplayTextFor(m => m.DemographicFilters[i].Question)
<br />
@Html.ListBoxFor(model => model.DemographicFilters[i].SelectedItems, new MultiSelectList(Model.DemographicFilters[i].Responses, "ResponseID", "Response", Model.DemographicFilters[i].SelectedItems), new { Multiple = "multiple" })
<br />
<br />
}
}
これが画面にレンダリングされたものです (私がやっていることを追ってみることができるように): http://i.imgur.com/ZefpLy1.png?1
編集:問題は、ビューがコントローラーにポストバックされ、ビューが正しく表示されるときですが、HttpPost では [n]SelectedItems の値は値を持つ [n-1]SelectedItems に依存します。
[i]SelectedItems が空白 (何も選択されていない) の場合、HttpGet で値が正しく設定されていても、すべての [>i]SelectedItems が null になります...
HTMLHelper 拡張機能:
#region Usings
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Web.Mvc.Html;
using System.Web.Mvc;
#endregion
namespace Extensions
{
public static class HtmlHelperExtensions
{
public static MvcHtmlString HiddenEnumerableFor<TModel, TEnumType>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, IEnumerable<TEnumType>>> expression)
{
return htmlHelper.Hidden(htmlHelper.NameFor(expression).ToHtmlString(),
string.Join(",", expression.Compile().Invoke(htmlHelper.ViewData.Model) ?? new TEnumType[0]));
}
}
}