【发布时间】:2013-09-11 17:34:37
【问题描述】:
我正在使用erichynds Multi Select Widget 为我的MultiSelectList 创建一个漂亮的样式。但我的问题(似乎)无关。
我正在尝试遍历每个DemographicQuestionFilter 问题,列出DemographicResponseFilter 响应并能够获取/发布所选项目以及我的DemographicFilterViewModel 模型。我遇到的问题是,当我在列表中为 item-1(索引 0)设置过滤器时它工作正常,当我设置 item-2(索引 1)时,它仅在 item-1 也设置时才有效,如果 item未设置 -1 则 DemographicFilters 对象为空。我假设我可以切换类型,或者我在这里缺少一些基本的东西。
如何使包含 n 个问题的选定项目的列表不依赖于 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 为空白(未选择任何内容),则每个 [>i]SelectedItems 为空,即使在 HttpGet 中正确设置了值...
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]));
}
}
}
【问题讨论】:
标签: c# asp.net-mvc razor listbox multi-select