2010-03-09 64 views
26

我注意到在我看來,在asp.net MVC中的錯誤,或者只是我做錯了什麼。我目前正在使用1.0,所以也許這將在2.0版本中解決。但無論如何,我們走吧。DropDownList設置在asp.net MVC的選定項目

當我的視圖模型的屬性與下拉列表中聲明的ID名稱相同時,所選項目將被忽略,並且呈現的html沒有任何選定內容。 不知道我是否做錯了,但更改id的名稱可以解決問題。我簡化了這個例子,希望它很清楚,否則請讓我知道。

這是我的看法,其中宣佈ID是相同的名稱作爲我的列表模型:

<table border="0" cellpadding="0" cellspacing="0"> 
    <tr> 
     <td> 
     <%= Html.DropDownList("IsMultipleServicers", Model.IsMultipleServicers) %> 
     </td> 
    </tr> 
</table> 

而呈現的HTML

<table border="0" cellpadding="0" cellspacing="0"> 
     <tr> 
     <td> 
      <select id="IsMultipleServicers" name="IsMultipleServicers"> 
       <option value="false">No</option> 
       <option value="true">Yes</option> 
      </select> 
     </td> 
     </tr> 
</table> 

現在,讓我們做一個小變化。我會將聲明的ID更改爲不同的內容。

這是我的觀點:

<table border="0" cellpadding="0" cellspacing="0"> 
    <tr> 
     <td> 
      <%= Html.DropDownList("MultipleServicers", Model.IsMultipleServicers) %> 
     </td> 
    </tr> 
</table> 

現在呈現的HTML:

<table border="0" cellpadding="0" cellspacing="0"> 
    <tr> 
     <td> 
     <select id="IsMultipleServicers" name="IsMultipleServicers"> 
      <option value="false">No</option> 
      <option selected="selected" value="true">Yes</option> 
     </select> 
     </td> 
    </tr> 
</table> 

注意,現在我得到一個選擇的選項,將在列表中的第二個元素。

這裏是我的ViewModel只是整合實驗:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace MVCProject.Models.ViewModels.Service 
{ 
    public class ServiceViewModel : ViewModel 
    { 
     public List<SelectListItem> IsMultipleServicers { get; set; } 
    } 
} 

這裏是我的行動:

[AcceptVerbs(HttpVerbs.Get)] 
public virtual ActionResult Service() 
{ 
    return View(new ServiceViewModel() 
    { 
     IsMultipleServicers = BuildBooleanSelectList(true) 
    }; 
} 

private List<SelectListItem> BuildBooleanSelectList(bool isTrue) 
{ 
    List<SelectListItem> list = new List<SelectListItem>(); 

    if (isTrue) 
    { 
     list.Add(new SelectListItem() { Selected = false, Text = "No", Value = "false" }); 
     list.Add(new SelectListItem() { Selected = true, Text = "Yes", Value = "true" }); 
    } 
    else 
    { 
     list.Add(new SelectListItem() { Selected = true, Text = "No", Value = "false" }); 
     list.Add(new SelectListItem() { Selected = false, Text = "Yes", Value = "true" }); 
    } 
return list; 
    } 

回答

43

我認爲這個問題是關於DropDownList重載一個困惑:

  1. Html.DropDownList(string name)尋找nameIEnumerable<SelectListItem>的視圖模型屬性。它將使用列表中選定的項目(SelectListItem.Selected == true),除非有相同名稱的表單帖子值。

  2. Html.DropDownList(string name, IEnumerable<SelectListItem> selectList)使用的物品從selectList,而不是他們選擇的值。通過在視圖模型(或發佈數據)中解析name並將其與SelectListItem.Value進行匹配,找到所選內容。即使該值無法找到(或爲null),它仍不會使用SelectListItems列表中的選定值。

您的代碼使用第二次重載,但指定不存在的「值」屬性(「MultipleServicers」)。

解決您的問題,要麼使用第一個重載:

<%= Html.DropDownList("IsMultipleServicers") %> 

或者,string MultipleServicers屬性添加到您的視圖模型,並在控制器中填充它。我建議這個解決方案,因爲它得到周圍幾個問題初步顯示,交顯示和後數據映射到一個視圖/樁模型:

public class ServiceViewModel : ViewModel 
{ 
    public string MultipleServicers { get; set; } 
    public List<SelectListItem> IsMultipleServicers { get; set; } 
} 

然後爲HTML代碼:

<%= Html.DropDownList(Model.MultipleServicers, Model.IsMultipleServicers) %> 

這技術映射到MVC2中:

<%= Html.DropDownListFor(x => x.MultipleServicers, Model.IsMultipleServicers) %> 
+0

我想這是比較明顯的。但現在是有意義的。謝謝 – ppumkin 2015-04-14 09:58:12

+0

我會建議你所有這一個:http://www.c-sharpcorner.com/UploadFile/4d9083/creating-simple-cascading-dropdownlist-in-mvc-4-using-razor/ – Umitk 2015-08-12 09:26:46

2

DropDownList助手從模型中提取默認值。在第一種情況下,在與該名稱對應的模型中的價值是的SelectList - 這不符合任何在列表中的項目,它是列表,所以選擇沒有價值。在第二個例子中,你的模型不包括該名稱的屬性,以便從模型中的價值不能被使用,它默認的狀態在選擇列表的本身表示。通常情況下,我都會對模型選定值的屬性 - 這成爲默認 - 和表示列表中的潛在價值的另一個屬性。

+0

什麼是好的解釋發生!定居在缺省實踐自己 - 好像把事情明確的最佳方式,並簡化了SelectListItem值的生成。 – 2015-12-04 23:11:24

9

我遇到了同樣的問題,使用Html.DropDownList(字符串名稱,IEnumerable selectList)重載。看起來我的模型具有與下拉列表名稱相同名稱的屬性。在這種情況下,MVC贊成我的Model對IEnumerable中每個條目的Selected屬性的屬性值。

的解決方案是使用一個名稱不匹配的屬性名稱的下拉列表。另一種解決方案是編寫我自己的擴展方法,忽略模型和視圖狀態,而是始終遵守所選屬性。

+1

我之前不得不使用這種方法進行快速修復,但我認爲它很好回顧並重構您的視圖模型以更好地利用Html.DropDownList,因爲它是打算使用的(因爲它可能會引起混淆) – 2011-06-02 01:47:28

相關問題