MVC Razor MultiSelectList 获取/设置 SelectedValue

本文关键字:设置 SelectedValue 获取 Razor MultiSelectList MVC | 更新日期: 2023-09-27 18:30:55

我正在使用erichynds Multi Select Widget为我的MultiSelectList创建一个漂亮的样式。 但我的问题(似乎)无关。

我正在尝试遍历每个DemographicQuestionFilter问题,列出DemographicResponseFilter响应,并能够获取/发布所选项目以及我的DemographicFilterViewModel模型。 我遇到的问题是,当我在列表中为 item-1(索引 0)设置过滤器时,它工作正常,当我设置 item-2(索引 1)时,它仅在同时设置项目-1 时才有效,如果未设置项目-1,则DemographicFilters对象为空。 我假设我可以切换类型,或者我在这里缺少一些基本的东西。

如何使包含 n 个问题的选定项目的列表不依赖于 n-1 也具有选定项目?

以下是我的视图模型对象:

父母:

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 />
    }
}

以下是呈现到屏幕上的内容(只是为了您可以尝试遵循我正在做的事情):https://i.stack.imgur.com/b1pK2.png

编辑:问题是当视图回发到控制器时,视图显示正确,但在 HttpPost 上,[n]选定项中的值依赖于具有值的 [n-1]选定项,

如果 [i]SelectedItems 为空(未选择任何内容),则每个 [>i]SelectedItems 都是空的,即使在 HttpGet 中正确设置了值...

HTMLHelper Extension:

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



MVC Razor MultiSelectList 获取/设置 SelectedValue

HiddenFor 不能用于 ListBoxFor 所以这是我试图解决这个问题的解决方法。

取代

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

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

这种方法的问题在于您的 DemographicFilters.SelectedItems 将添加额外的行 -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)