【问题标题】:Rendering issue using SelectList from manually defined SelectListItems in MVC 2使用 MVC 2 中手动定义的 SelectListItems 中的 SelectList 呈现问题
【发布时间】:2010-09-17 15:54:25
【问题描述】:

我正在使用 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 会提供一种一致的方式来遍历值和显示文本。

先谢谢了,希望有人能帮忙。

干杯,

J

【问题讨论】:

  • FWIW,不应该存在没有实现的“私有集”。

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


【解决方案1】:

下拉列表也可以处理List&lt;SelectListItem&gt;,只需发送它即可。

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”

【讨论】:

  • 太棒了!谢谢,它有效!为什么会这样,我仍然不确定 - 我认为 SelectList 和 SelectListItem 是为彼此而设计的。无论如何,这已经成功了,并且明确地让车轮再次滚动。干杯,感谢您的快速回复。
  • 别忘了将我的答案设为“答案”
  • @请编辑答案以返回,并可能将字段重命名为小写。
【解决方案2】:

您可以使用编辑器模板来完成。称它为“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 列表,该列表将绑定为布尔值。

【讨论】:

    【解决方案3】:

    试试这个代码:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多