【问题标题】:MVC Razor MultiSelectList Getting/Setting SelectedValueMVC Razor MultiSelectList 获取/设置 SelectedValue
【发布时间】: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


    【解决方案1】:

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

    替换

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

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

    这种方法的问题是您的 DemographicFilters.SelectedItems 将添加一个额外的行 -1,需要添加代码以排除 -1 行。

    【讨论】:

    • 我会在早上试试这个。我尝试创建一个包含单个“0”int 的列表作为不同的解决方法(我删除了隐藏字段),但这没有帮助。一旦我试过这个,我会在明天回帖:-)
    • 您的解决方案有效,我只是更喜欢以@html.HiddenBlah 的方式进行:)谢谢!
    【解决方案2】:

    我的回答是对 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)
    

    【讨论】:

    • 我明天将测试您的解决方案,但视图中不应有任何空值。视图正确获取数据并正确显示,它是 PostBack,它使用视图中设置的缺失值回发。因此,如果 filter.SelectedItems 有一个值,那么 filter.index -1.SelectedItems 必须有一个值集(必须选择项目)。
    • 好吧,我的回答对您没有帮助,请在您的问题中发布该信息,因为不清楚。
    • @Html.HiddenEnumerableFor(m => m.DenographicFilders[i].SelectedItems):它说找不到 HiddenEnumerableFor(自动完成也找不到)。 - 我把我的扩展方法类放在问题中,以防我错过了什么!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    相关资源
    最近更新 更多