我的下拉列表有什么问题?

本文关键字:问题 什么 下拉列表 我的 | 更新日期: 2023-09-27 18:04:33

下拉列表不会选择我需要的值

 Dictionary<int,int> RowDict = new Dictionary<int, int>();
 for (int i = 1; i < 11; i++)
 {
      RowDict.Add(i, i);
 }
 var rows = new SelectList(RowDict, "Key", "Value", 6);
 ViewBag.Rows = rows;

视图中的代码如下:

  <div class="editor-label">
       @Html.LabelFor(m => m.Rows)
  </div>
 <div class="editor-field">
      @Html.DropDownListFor(m => m.Rows, (SelectList)ViewBag.Rows)
      @Html.ValidationMessageFor(m => m.Rows)
 </div>

当我运行代码6没有被选中。您能看到这段代码中的错误吗?

我的下拉列表有什么问题?

m => m. rows表明其中有一个模型。如果您使用模型中的行进行初始化,而不是使用视图包,则效果会更好。

一个非常快速和肮脏的初始化,像这样:

   public class TestModel
   {
      public TestModel()
      {
         Dictionary<int, int> RowDict = new Dictionary<int, int>(); 
         for (int i = 1; i < 11; i++) 
         { 
            RowDict.Add(i, i); 
         }
         this.Rows = new SelectList(RowDict, "Key", "Value");
         this.SelectedId = "6"; // binding to selection works as a String
      }
      public SelectList Rows { get; set; }
      public string SelectedId { get; set; }
   }

在请求视图的控制器中:

return View(new TestModel());

和以如下开头的视图:

@model <insert_appropriate_anmespace_here>.TestModel

@Html.DropDownListFor(m => m.Rows, Model.Rows, Model.SelectedId) 

使它工作。只要记住模型是按值传递给视图的,你就可以按照你想要的方式调整这段代码和初始化,这就是我在构造函数中设置init的原因(每次创建TestModel时,Select List都会初始化)。

你也可以把viewbag和model混合在一起,让它工作,但我不建议这样做,因为可读性。

作为第一步,您需要将SelectList构造函数中的selectedValue变为字符串而不是整数。

var rows = new SelectList(RowDict, "Key", "Value", "6");

代替

var rows = new SelectList(RowDict, "Key", "Value", 6);

@Matthieu,我测试了你的方法,也是我自己的方式,我使用控制器来填充字典和SelectList。然后我让视图继承模型并显示下拉列表。但两者都行不通。那么通过ViewData传递SelectList然后在视图中显示它不是更容易吗?例子:

控制器

var rowDict = new Dictionary<int, int>(); 
for (var i = 1; i < 11; i++)
    rowDict.Add(i, i);
var rows = new SelectList(rowDict, "Key", "Value", 6);
ViewData["Rows"] = rows;
return View();
视图

<%: Html.DropDownList("ItemsDropDown", (SelectList)ViewData["Rows"]) %>
编辑:

多亏了Ukko将所选参数提示为字符串,所以我所尝试的代码也能正常工作,而且您不需要通过ViewModel的构造函数填充SelectList。这个想法本身实际上是不合逻辑的,因为它是在控制器中,你需要填充ViewModel并将其传递给视图:

模型:

public class HomeModel
{
    public SelectList Rows { get; set; }
    public String Selected { get; set; }
}
控制器

var rowDict = new Dictionary<int, int>();
for (var i = 1; i < 11; i++)
    rowDict.Add(i, i);
var rows = new SelectList(rowDict, "Key", "Value");
var model = new HomeModel { Rows = rows, Selected = "6" };
return View(model);

视图:

<div class="editor-field">
    <%: Html.DropDownListFor(model => model.Rows, Model.Rows, Model.Selected) %>
</div>