Html.DropdownListFor未设置选定值

Ibr*_*ain 92 asp.net-mvc razor

如何设置Html.DropDownListFor的选定值?我一直在网上看看,并且已经看到它可以通过使用第四个参数来实现,如下所示:

@Html.DropDownListFor(m => m, new SelectList(Model, "Code", "Name", 0),  "Please select a country")
Run Code Online (Sandbox Code Playgroud)

我的选择列表然后显示如下:

<select id="ShipFromCountries" name="ShipFromCountries">
     <option value="">Please select a country</option>
     <option value="GB">United Kingdom</option>
     <option value="US">United States</option>
     ...
</select>
Run Code Online (Sandbox Code Playgroud)

但由于某种原因英国仍然被选中,但我想要"请选择一个国家"进行选择.

谁知道我怎么能做到这一点?

编辑

我已经更新了我的代码,因为功能略有变化,但似乎仍然遇到这个问题.这就是我的看法:

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")
Run Code Online (Sandbox Code Playgroud)

1option我想要选择的Id ,我也试过了文本,option但也没有用.

有任何想法吗?

Rom*_*ias 172

您的代码存在一些概念问题:

首先,

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")
Run Code Online (Sandbox Code Playgroud)

使用DropDownListFor时,第一个参数是提交表单后存储所选值的属性.因此,在您的情况下,您应该拥有SelectedOrderId模型的一部分或类似的东西,以便以这种方式使用它:

@Html.DropDownListFor(n => n.SelectedOrderId, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")
Run Code Online (Sandbox Code Playgroud)

第二,

除了使用ViewBag之外,这没有错,但有更好的方法(将信息放在ViewModel中),当您持有SelectList的ViewBag属性时,存在"小错误"(或未预期的行为)放置所选值的属性的相同名称.要避免这种情况,请在命名包含项目列表的属性时使用其他名称.

如果我是你,我会使用一些代码来避免这个问题并编写更好的MVC代码:

视图模型:

public class MyViewModel{
   public int SelectedOrderId {get; set;}
   public SelectList OrderTemplates {get; set;}

   // Other properties you need in your view
}
Run Code Online (Sandbox Code Playgroud)

控制器:

public ActionResult MyAction(){
   var model = new MyViewModel();
   model.OrderTemplates = new SelectList(db.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1);
   //Other initialization code

   return View(model);
}
Run Code Online (Sandbox Code Playgroud)

在您的视图中:

@Html.DropDownListFor(n => n.SelectedOrderId, Model.OrderTemplates, "Please select an order template")
Run Code Online (Sandbox Code Playgroud)

  • 保存了我的一天:"...当您持有SelectList的ViewBag属性与放置所选值的属性的名称相同时,会出现一个小错误.为避免这种情况,请在命名属性时使用另一个名称项目清单." 谢谢! (41认同)
  • 这个"小虫子"绝对疯狂!因此,我浪费了2个小时的生命.如此明显的东西如何仍然存在而不能得到修补? (4认同)
  • _有一点bug_?它根本不是一个bug.模型绑定通过绑定到属性的值来工作,当你绑定到`OrderTemplates`时,你试图绑定到`ViewBag`属性,它是`IEnumerabe <SelectListItem>`的类型.但是`<select>`元素不能绑定到复杂对象的集合(只有值类型) (2认同)

小智 20

对我来说,没有工作,所以这样工作:

控制器:

int selectedId = 1;

ViewBag.ItemsSelect = new SelectList(db.Items, "ItemId", "ItemName",selectedId);
Run Code Online (Sandbox Code Playgroud)

视图:

@Html.DropDownListFor(m => m.ItemId,(SelectList)ViewBag.ItemsSelect)
Run Code Online (Sandbox Code Playgroud)

JQuery的:

$("document").ready(function () {
    $('#ItemId').val('@Model.ItemId');
});
Run Code Online (Sandbox Code Playgroud)

  • 您的控制器的括号数量错误:它有一个左括号和两个右括号. (2认同)

Fel*_*ani 7

当您传递这样的对象时:

new SelectList(Model, "Code", "Name", 0)
Run Code Online (Sandbox Code Playgroud)

你说,Source(Model)和Key("Code")是Text("Name")和选中的值0.可能你的属性0源没有值Code,因此,html助手会选择第一个元素.要将真正的selectedValue传递给此控件.