1

私は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]));
        }
    }
}



4

2 に答える 2

2

HiddenFor は ListBoxFor には使用できないため、問題を解決するために試みた回避策を次に示します。

交換済み

  @Html.HiddenFor(model => filter.SelectedItems)

  @Html.Hidden(string.Format("DemographicFilters[{0}].SelectedItems", i), "-1")

このアプローチの問題は、 DemographicFilters.SelectedItems に余分な行 -1 が追加され、 -1 行を除外するコードを追加する必要があることです。

于 2013-09-11T20:22:28.627 に答える
1

私の答えは、配列では機能しない Vasanth Sundaralingam が彼の答えに投稿したものの拡張HiddenForです。先に進み、hiddenFor列挙可能なプロパティのように動作する関数を作成しました。

@functions
{
    public MvcHtmlString HiddenEnumerableFor<TModel, TEnumType>(
        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]));
    }
}

交換

@Html.HiddenFor(model => filter.SelectedItems)

@HiddenEnumerableFor(Html, m => m.DemographicFilters[i].SelectedItems)

これを静的クラスに追加thisし、最初のパラメーターの前に追加することで、これを拡張メソッドに変換することもできます。そうすれば、非常に似ているように見えますHiddenFor

@Html.HiddenEnumerableFor(m => m.DemographicFilters[i].SelectedItems)
于 2013-09-11T18:32:20.693 に答える