使用来自MVC 2中手动定义的SelectListItems的SelectList渲染问题

时间:2010-09-17 15:54:25

标签: c# model-view-controller asp.net-mvc-2 selectlist

我正在使用ASP.NET MVC 2(.NET 3.5),需要手动定义什么是选项列表。当我这样做时,我得到一个下拉菜单,每个手册条目都是“System.Web.Mvc.SelectListItem”。

我的视图模型定义了这样的列表:

    public SelectList YesNoList
    {
      get
      {
        List<SelectListItem> tmpList = new List<SelectListItem>();
        tmpList.Add(new SelectListItem {Text = "", Value = ""});
        tmpList.Add(new SelectListItem {Text = "Yes", Value = "1"});
        tmpList.Add(new SelectListItem {Text = "No", Value = "0"});
        YesNoList = new SelectList(tmpList,"");
      }
      private set{}
     }

在视图中,我使用Html.DropDownList:

引用它
Html.DropDownList("FieldName", viewmodel.YesNoList);

我期望在最终网页上呈现的内容应该是:

<select id="FieldName" name="FieldName">
  <option value=""/>
  <option value="1">Yes</option>
  <option value="0">No</option>
</select>

相反,我得到:

<select id="FieldName" name="FieldName">
  <option>System.Web.Mvc.SelectListItem</option>
  <option>System.Web.Mvc.SelectListItem</option>
  <option>System.Web.Mvc.SelectListItem</option>
</select>

我很茫然,因为我无法弄清楚为什么返回这个类型所以如果有人能指出我对viewmodel定义有什么问题,或者指出一个更好的方法,我会很感激。我对从C#类集合派生SelectList犹豫不决,因为SelectList将提供一种迭代方式来迭代值和显示文本。

提前致谢,希望有人可以提供帮助。

干杯,

Ĵ

3 个答案:

答案 0 :(得分:7)

下拉列表也可以处理List<SelectListItem>,只需发送它即可。

Html.DropDownList("FieldName", viewmodel.YesNoList);

public List<SelectListItem> YesNoList
{
  get
  {
    List<SelectListItem> YesNoList = new List<SelectListItem>();
    YesNoList.Add(new SelectListItem {Text = "", Value = ""});
    YesNoList.Add(new SelectListItem {Text = "Yes", Value = "1"});
    YesNoList.Add(new SelectListItem {Text = "No", Value = "0"});
    return YesNoList;
  }
  private set{}
 }

你实际上在制作选择列表时做错了。

它应该是:

new SelectList(tmpList, "Value", "Text"); 

然后忘记我上面的代码。如果你给它列表和值和文本“key”

,你可以使用任何List执行此操作

答案 1 :(得分:0)

您可以使用编辑器模板来完成此操作。称之为“YesNo”并包含以下代码......

@Modeltype Boolean

@Code
  Dim YesNoList = New List(Of SelectListItem)()
  YesNoList.Add(New SelectListItem() With {.Text = "Yes", .Value = True})
  YesNoList.Add(New SelectListItem() With {.Text = "No", .Value = False})

  Dim list = New SelectList(YesNoList, "Value", "Text", Model)
End Code

@Html.DropDownList("", list)

然后在您的模型中为您的媒体资源指定一个'YesNo'的UIHint。这意味着现在EditorFor这个属性将为您提供一个很好的Yes / No列表,它将作为布尔值绑定。

答案 2 :(得分:0)

试试这段代码:

OdbcDataReader iLRt1 = databaseFunctions.databaseConnection.getFromDatabaseReader("select * from groups order by head");

List<SelectListItem> Hello1 = new List<SelectListItem>();
Hello1.Add(new SelectListItem { Text = "Select All", Value = "Select All" });

while (iLRt1.Read())
{
    Hello1.Add(new SelectListItem { Text = iLRt1["head"].ToString(), Value = iLRt1["code"].ToString() });}

ViewData["myList2"] = Hello1;