109

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

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

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

<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>

但由于某种原因,英国仍然被选中,但我希望选择“请选择一个国家”。

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

编辑

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

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

1是我想要选择的 Id option,我也尝试过使用 the 的文本,option但这也不起作用。

有任何想法吗?

4

13 回答 13

197

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

首先

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

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

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

除了使用 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
}

控制器:

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

   return View(model);
}

在您看来:

@Html.DropDownListFor(n => n.SelectedOrderId, Model.OrderTemplates, "Please select an order template")
于 2013-11-15T19:14:29.260 回答
25

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

控制器:

int selectedId = 1;

ViewBag.ItemsSelect = new SelectList(db.Items, "ItemId", "ItemName",selectedId);

看法:

@Html.DropDownListFor(m => m.ItemId,(SelectList)ViewBag.ItemsSelect)

查询:

$("document").ready(function () {
    $('#ItemId').val('@Model.ItemId');
});
于 2014-12-12T05:19:24.770 回答
9

当您传递这样的对象时:

new SelectList(Model, "Code", "Name", 0)

你是说: Source ( Model) 和 Key ( "Code") Text ( "Name") 和选定的值0。您的属性源中可能没有0Code,因此 HTML Helper 将选择第一个元素以将实际 selectedValue 传递给此控件。

于 2013-10-20T12:48:49.887 回答
3

确保在分配之前修剪了选定的值。

//模型

public class SelectType
{
    public string Text { get; set; }
    public string Value { get; set; }
}

//控制器

var types = new List<SelectType>();
types.Add(new SelectType() { Value =  0, Text = "Select a Type" });
types.Add(new SelectType() { Value =  1, Text = "Family Trust" });
types.Add(new SelectType() { Value =  2, Text = "Unit Trust"});
ViewBag.PartialTypes = types;

//看法

@Html.DropDownListFor(m => m.PartialType, new SelectList(ViewBag.PartialTypes, "Value", "Text"), new { id = "Type" })
于 2013-11-15T18:43:44.347 回答
3

如果您知道视图中的内容,您也可以从 Controller 设置默认值,而不是将其设置到 view/cshtml 文件中。 无需从 HTML 端设置默认值。

在控制器文件中。

commission.TypeofCommission = 1;
return View(commission);

在 .cshtml 文件中。

@Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Select--")
于 2015-10-15T06:31:54.560 回答
1

你应该忘记上课

选择列表

在您的控制器中使用它:

var customerTypes = new[] 
{ 
    new SelectListItem(){Value = "all", Text= "All"},
    new SelectListItem(){Value = "business", Text= "Business"},
    new SelectListItem(){Value = "private", Text= "Private"},
};

选择值:

var selectedCustomerType = customerTypes.FirstOrDefault(d => d.Value == "private");
if (selectedCustomerType != null)
    selectedCustomerType.Selected = true;

将列表添加到 ViewData:

ViewBag.CustomerTypes = customerTypes;

在您的视图中使用它:

@Html.DropDownList("SectionType", (SelectListItem[])ViewBag.CustomerTypes)

-

更多信息请访问:http ://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc

于 2014-11-27T16:23:48.020 回答
0

添加控制器部分

  ViewBag.Orders= new SelectList(db.Orders, "Id", "business", paramid);

添加 Html 部分

   @Html.DropDownList("Orders", null)

一个简单的方法

于 2015-06-22T12:54:33.077 回答
0

对我来说一般解决方案:)

@{
     var selectedCity = Model.Cities.Where(k => k.Id == Model.Addres.CityId).FirstOrDefault();
     if (selectedCity != null)
     { 
         @Html.DropDownListFor(model => model.Addres.CityId, new SelectList(Model.Cities, "Id", "Name", selectedCity.Id), new { @class = "form-control" })
     }
     else
     { 
         @Html.DropDownListFor(model => model.Cities, new SelectList(Model.Cities, "Id", "Name", "1"), new { @class = "form-control" })
     }
}
于 2015-07-15T08:26:14.857 回答
0

Linq to Dropdown with empty item, selected item (works 100%)
(Strongly Typed, Chances for error minimum) 任何模型更改都将反映在绑定中

控制器

public ActionResult ManageSurveyGroup()
    {
        tbl_Survey sur = new tbl_Survey();
        sur.Survey_Est = "3";

        return View(sur);
    }

看法

        @{


    //Step One : Getting all the list
    var CompEstdList = (from ComType in db.tbl_CompEstdt orderby ComType.Comp_EstdYr select ComType).ToList();

    //Step Two  : Adding a no Value item **
    CompEstdList.Insert(0, new eDurar.Models.tbl_CompEstdt { Comp_Estdid = 0, Comp_EstdYr = "--Select Company Type--" });

    //Step Three : Setting selected Value if value is present
    var selListEstd= CompEstdList.Select(s => new SelectListItem { Text = s.Comp_EstdYr, Value = s.Comp_Estdid.ToString() });

        }
        @Html.DropDownListFor(model => model.Survey_Est, selListEstd)
        @Html.ValidationMessageFor(model => model.Survey_Est)

这种绑定数据的方法也是可以的

var selList = CompTypeList.Select(s => new SelectListItem { Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString(), Selected = s.CompTyp_Id == 3 ? true : false });
于 2016-05-10T09:12:21.010 回答
0

我知道这并不是问题的真正答案,但是当我一直绊倒这篇文章时,我一直在寻找一种方法来从视图中的动态列表中初始化 DropDownList。

我的错误是我试图从字典中创建一个 SelectList,如下所示:

//wrong!
@Html.DropDownListFor(m => m.Locality, new SelectList(new Dictionary<string, string>() { { Model.Locality, Model.Locality_text } }, Model.Locality, ...

然后我去挖掘官方msdn doc,发现DropDownListFor不一定需要 a SelectList,而是 a IEnumerable<SelectListItem>

//right
@Html.DropDownListFor(m => m.Locality, new List<SelectListItem>() { new SelectListItem() { Value = Model.Locality, Text = Model.Locality_text, Selected = true } }, Model.Locality, new { @class = "form-control select2ddl" })

在我的情况下,我可能也可以省略Model.Localityas selected 项目,因为它 a) 唯一的项目和 b) 它已经在SelectListItem.Selected属性中说明了它。

如果您想知道,数据源是一个 AJAX 页面,它使用 SelectWoo/Select2 控件动态加载。

于 2018-01-15T11:57:41.163 回答
0
public byte UserType
public string SelectUserType

你需要得到一个并设置不同的。所选值不能与您要设置的项目相同。

@Html.DropDownListFor(p => p.SelectUserType, new SelectList(~~UserTypeNames, "Key", "Value",UserType))

我在列表中使用 Enum 字典,这就是为什么有“键”、“值”对的原因。

于 2018-01-16T12:59:57.637 回答
0

我有一个类似的问题,我使用相同的 ViewBag 和 Element 名称。(打字错误)

于 2018-10-21T21:51:28.267 回答
0

这是 CSS 问题。我不知道为什么 Bootstrap 4 中的 @Html.DropDownListFor 不起作用。当然这是类设计问题。无论如何,如果您的下拉输入框有 CSS Padding: #px, # px; 元素然后禁用它。希望这会奏效。

于 2020-05-29T23:05:55.417 回答