我的Dropdownlist有什么问题

时间:2011-08-05 15:58:19

标签: c# asp.net-mvc-3

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

 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 未被选中。你能看到这段代码中的错误吗?第一个值被选中。

3 个答案:

答案 0 :(得分:2)

m =&gt; 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时) ,选择列表将被初始化。

此外,您可以混合使用viewbag和模型并使其工作,我不建议将其用于可读性。

答案 1 :(得分:0)

@Matthieu,我测试了你的方法,也是我自己的方式,我使用Controller来填充Dictionary和SelectList。然后我使View继承自模型并显示DropDownList。但两者都行不通。那么通过ViewData传递SelectList然后在View中显示它会不会更容易?例如:

控制器

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并将其传递给View:

型号:

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>

答案 2 :(得分:0)

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

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

而不是

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