我正在使用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
编辑:问题是当View发回到控制器时,View正确显示,但在HttpPost上,[n] SelectedItems中的值依赖于[n-1]具有值的SelectedItems,
如果[i] SelectedItems为空(未选择任何内容),则每个[&gt; 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]));
}
}
}
答案 0 :(得分:2)
HiddenFor不能用于ListBoxFor,所以这是我试图解决问题的解决方法。
替换
@Html.HiddenFor(model => filter.SelectedItems)
使用
@Html.Hidden(string.Format("DemographicFilters[{0}].SelectedItems", i), "-1")
这种方法的问题在于你的DemographicFilters.SelectedItems会添加一个额外的行-1,需要添加代码来排除-1行。
答案 1 :(得分: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)