Html.DropdownList对于未设置所选值


97

如何设置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")

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

有任何想法吗?

Answers:


182

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

首先

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

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

@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")

43
保存了我的一天:“ ...当您保存SelectList的ViewBag属性与您放置所选值的属性名称相同时,会出现一个小错误。项目列表。” 谢谢!
Michael A. Volz又名Flynn

4
这个“小虫子”绝对是精神错乱!正因为如此,我浪费了两个小时。如此明显的东西怎么仍然存在并且不被修补?

1
弗林,您的评论实际上应该是答案。我尝试了疯狂的实现以使我的下拉列表正常工作,这是简单的解决方案
Dwayne Hinterlang 2015年

2
有一个小虫子吗?它根本不是一个错误。模型绑定通过绑定到属性的值以及在OrderTemplates您尝试绑定到ViewBagtypeof 的属性时起作用IEnumerabe<SelectListItem>。但是<select>元素不能绑定到复杂对象的集合(仅是值类型)

如果不是这个答案,我会浪费一整天。严重的是,这个小错误是为什么我们应该在观察

22

对我来说不是这样工作的:

控制器:

int selectedId = 1;

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

视图:

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

jQuery的:

$("document").ready(function () {
    $('#ItemId').val('@Model.ItemId');
});

2
您的控制器的括号数量错误:它有一个开括号和两个闭括号。
阿莫斯(Amos Long)

7

当您传递这样的对象时:

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

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


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" })

2

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

在控制器文件中。

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

在.cshtml文件中。

@Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Select--")

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



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" })
     }
}

0

Linq to Dropdown带有空项目,选中的项目(有效100%)
(强类型输入,最小错误几率)任何模型更改将反映在绑定中

控制者

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 });

var selList = CompTypeList.Select(s => new SelectListItem {文本= s.CompTyp_Name,值= s.CompTyp_Id.ToString(),Selected = s.CompTyp_Id == 3?true:false});

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并不一定需要一个SelectList,而是一个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.Locality选中的项,因为它是a)唯一的项,而b)已经在SelectListItem.Selected属性中说明了。

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


0
public byte UserType
public string SelectUserType

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

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

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



0

这是CSS问题。我不知道为什么Bootstrap 4中的@ Html.DropDownListFor不起作用。当然这是类设计问题。无论如何,如果您的下拉列表输入框具有CSS填充,则工作范围是:#px,#px; 元素,然后将其禁用。希望这会起作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.