[英]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.