簡體   English   中英

MVC Razor MultiSelectList獲取/設置SelectedValue

[英]MVC Razor MultiSelectList Getting/Setting SelectedValue

我正在使用erichynds Multi Select Widget為我的MultiSelectList創建一個不錯的樣式。 但是我的問題(似乎)是無關緊要的。

我試圖遍歷每個DemographicQuestionFilter問題,列出DemographicResponseFilter響應,並能夠獲取/發布所選項目以及我的DemographicFilterViewModel模型。 我遇到的問題是,當我在列表中為item-1(索引0)設置過濾器時,它可以正常工作;當我設置item-2(索引1)時,它也僅在同時設置了item-1的情況下有效,如果未設置-1,則DemographicFilters對象為null。 我假設我可以切換類型,或者我在這里錯過了一些基本的知識。

如何使包含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為空白(未選擇任何內容),則即使[Http]中正確設置了值,每個[> 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]));
        }
    }
}



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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM