2012-01-04 47 views
2

我有兩個多選列表框;一個伴月,一個有着多年如下列:ASP.NET MVC(剃鬚刀)Listbox多選字符串值

@Html.ListBoxFor(m => m.IncludeGuestsArrivedInTimeframeMonths, Model.TimeframeMonths) 
@Html.ListBoxFor(m => m.IncludeGuestsArrivedInTimeframeYears, Model.TimeframeYears) 

我節省了兩個值,以數據庫爲逗號分隔列表(串/ NVARCHAR)。值如下:月份: 1,3,7; 年份: 2002,2005

由於某些原因,當我將值拉回到窗體時,幾個月在列表框中預先選好,但這些年沒有。

任何想法?


EDIT - 附加代碼樣品:

控制器 - 管理

public ActionResult Manage(Guid id) 
    { 
     var list = _listService.GetList(id); 

     var model = LoadModelFromObject(list); 
     model.TimeframeMonths = GenerateMonthDropdown(); 
     model.TimeframeYears = GenerateYearDropdown(model.IncludeGuestsArrivedInTimeframeYears.Split(',')); 
     model.DaysOfWeek = GenerateDaysOfWeekDropdown(); 

     return View(model); 
    } 

控制器 - '幫助器'

private IList<SelectListItem> GenerateYearDropdown(string[] selected) 
    { 
     var list = new List<SelectListItem>(); 

     var startYear = DateTime.Now.Year - 10; 

     for (int idx = startYear; idx < startYear + 11; idx++) 
     { 
      list.Add(new SelectListItem 
         { 
          Value = idx.ToString(), 
          Text = idx.ToString(), 
          Selected = selected != null && selected.Contains(idx.ToString()) 
         }); 
     } 

     return list; 
    } 

查看

@Html.CheckBoxFor(m => m.IncludeGuestsArrivedInTimeframe) 
@Html.LabelFor(m => m.IncludeGuestsArrivedInTimeframe) 
@Html.ListBoxFor(m => m.IncludeGuestsArrivedInTimeframeMonths, Model.TimeframeMonths) 
@*@Html.ListBoxFor(m => m.IncludeGuestsArrivedInTimeframeYears, Model.TimeframeYears)*@ 
@Html.ListBox("IncludeGuestsArrivedInTimeframeYears", Model.TimeframeYears) 
+0

'Model.TimeframeYears'返回什麼?我的意思是價值觀。它必須返回IEnumerable 類型,但我看不到它具有的值。 – tugberk 2012-01-04 15:28:44

+0

@tugberk Model.TimeframeYears有'IList ',每個SelectListItem的值和文本是年份(2002) – 2012-01-04 15:46:24

+0

您能否提供說明'IncludeGuestsArrivedInTimeframeYears'和'TimeframeYears'屬性問題的示例值? – 2012-01-04 17:45:56

回答

3

您需要設置SelectItemList類真正的Selected屬性要預先選擇的選項。

實施例:

@{ 
    var foo = new List<SelectListItem> { 
     new SelectListItem { Text = "Foo 1", Value = "1", Selected = true }, 
     new SelectListItem { Text = "Foo 2", Value = "2" }, 
     new SelectListItem { Text = "Foo 3", Value = "3", Selected = true } 
    }; 
} 

@Html.ListBox("foo", foo) 

在這種情況下,富1和Foo 3應預先選定出現。上面的代碼生成下面的HTML標記:

<select id="foo" multiple="multiple" name="foo"> 
    <option selected="selected" value="1">Foo 1</option> 
    <option value="2">Foo 2</option> 
    <option selected="selected" value="3">Foo 3</option> 
</select> 

編輯:使用此代碼

list.Add(new SelectListItem { 
    Value = idx.ToString(), 
    Text = idx.ToString(), 
    Selected = selected != null && selected.Contains(idx.ToString()) 
}); 

首先,更換此代碼

list.Add(new SelectListItem { 
    Value = idx.ToString(), 
    Text = idx.ToString(), 
    Selected = true 
}); 

然後運行該應用程序。如果所有的選項都是預選的,那麼我敢打賭這個selected != null && selected.Contains(idx.ToString())不符合條件。

+0

好的,我改變了一點點。我有一個名爲** GenerateYearDropdown **的方法,我修改了它以接收一個字符串數組,並將其傳入。數組傳遞正確,並設置每個列表項的_selected_值,但不顯示這些選擇表格。 – 2012-01-04 16:55:39

+0

@mmillican你試過了上面的代碼嗎?它適用於我的機器,並且也適用於您的機器。問題出在您的代碼上,並將其發佈。 – tugberk 2012-01-04 17:41:06

+0

我使用其他代碼更新了原始帖子。謝謝! – 2012-01-04 18:22:55

0

,因爲它似乎(如這裏Preselect Items in Multiselect-Listbox (MVC3 Razor))剃刀發動機愉快忽略 Selected屬性,並通過調用從模型中的對象的ToString(),並使用字符串比較從模型和所提供的選項列表中的列表進行比較選擇。

我無法向自己解釋的是爲什麼此行爲與Html.ListBox()一起使用,該行爲不使用任何模型並且期望SelectListItem的集合。

認爲這是一個錯誤,但它似乎沒有被最近解決。

1

做的另一種方式,它

@Html.ListBox("categoryId", new MultiSelectList(ViewData["categories"] as System.Collections.IEnumerable, "Id", "CategoryName", Model.tIdx_ProductCategories.Select(x => x.CategoryId).AsEnumerable())) 

說明:

  1. categoryId - 將是控制的名字,當爲HTML渲染
  2. ViewData["categories"] - 是類別與IdCategoryName屬性列表
  3. Model.tIdx_ProductCategories帶有類別ID列表列表框中列出。