Html.DropdownListFor 未设置所选值
Posted
技术标签:
【中文标题】Html.DropdownListFor 未设置所选值【英文标题】:Html.DropdownListFor selected value not being set 【发布时间】:2013-10-28 21:11:51 【问题描述】:如何设置 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
是我要选择的 option
的 ID,我也尝试过使用 option
的文本,但这也不起作用。
有什么想法吗?
【问题讨论】:
【参考方案1】:您的代码存在一些概念问题:
第一,
@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 中),当您的 ViewBag 属性出现时,会有一个“小错误”(或未察觉的行为) ,您持有 SelectList 的位置与放置所选值的属性的名称相同。为避免这种情况,只需在命名包含项目列表的属性时使用另一个名称。
如果我是你,我会使用一些代码来避免这个问题并编写更好的 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")
【讨论】:
拯救了我的一天:“...当您持有 SelectList 的 ViewBag 属性与您放置所选值的属性名称相同时,会出现一个小错误。为避免这种情况,只需在命名保存项目列表的属性时使用另一个名称。”谢谢! 这个“小虫子”简直是疯了!就因为这个,浪费了我生命中的两个小时。如此明显的东西怎么可能还存在而不被修补? 弗林,您的评论实际上应该是一个答案。我尝试了疯狂的实现来让我的下拉列表工作,这是简单的解决方案 有一个小错误?它根本不是一个错误。模型绑定通过绑定到属性的值来工作,当您绑定到OrderTemplates
时,您尝试绑定到类型为IEnumerabe<SelectListItem>
的ViewBag
属性。但是<select>
元素不能绑定到复杂对象的集合(只能是值类型)
天哪,如果不是这个答案,我会浪费一整天的时间。说真的,LITTLE BUG 是我们应该放弃 viewbag 的原因【参考方案2】:
对我来说没有这样的工作方式:
控制器:
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');
);
【讨论】:
您的控制器的括号数量错误:它有一个左括号和两个右括号。【参考方案3】:当你传递这样一个对象时:
new SelectList(Model, "Code", "Name", 0)
您说的是:源 (Model
) 和键 ("Code"
) 文本 ("Name"
) 和选定的值 0
。您的 Code
属性的源中可能没有 0
值,因此 HTML Helper 将选择第一个元素以将实际 selectedValue 传递给此控件。
【讨论】:
【参考方案4】:确保在分配之前修剪了选定的值。
//型号
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" )
【讨论】:
【参考方案5】:如果您知道视图中的内容,您也可以从 Controller 中设置默认值,而不是将其设置到 view/cshtml 文件中。 无需从 HTML 端设置默认值。
在控制器文件中。
commission.TypeofCommission = 1;
return View(commission);
在 .cshtml 文件中。
@Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Select--")
【讨论】:
【参考方案6】:你应该忘记上课
选择列表
在您的控制器中使用它:
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
【讨论】:
【参考方案7】:添加控制器部分
ViewBag.Orders= new SelectList(db.Orders, "Id", "business", paramid);
添加 Html 部分
@Html.DropDownList("Orders", null)
一个简单的方法
【讨论】:
一个简单的替代事务处理【参考方案8】:对我来说一般解决方案:)
@
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" )
【讨论】:
【参考方案9】: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 Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString(), Selected = s.CompTyp_Id == 3 ? true : false );【参考方案10】:我知道这并不是问题的真正答案,但是当我一直绊倒这篇文章时,我一直在寻找一种方法来从视图中的动态列表中初始化 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 控件动态加载。
【讨论】:
【参考方案11】:public byte UserType
public string SelectUserType
你需要得到一个并设置不同的。所选值不能与您要设置的项目相同。
@Html.DropDownListFor(p => p.SelectUserType, new SelectList(~~UserTypeNames, "Key", "Value",UserType))
我在列表中使用 Enum 字典,这就是为什么会有“键”、“值”对。
【讨论】:
【参考方案12】:我遇到了类似的问题,我使用相同的 ViewBag 和 Element 名称。 (打字错误)
【讨论】:
【参考方案13】:这是 CSS 问题。我不知道为什么 Bootstrap 4 中的 @Html.DropDownListFor 不起作用。当然这是类设计问题。无论如何,如果您的下拉输入框有 CSS Padding: #px, # px;元素然后禁用它。希望这会奏效。
【讨论】:
以上是关于Html.DropdownListFor 未设置所选值的主要内容,如果未能解决你的问题,请参考以下文章
c# mvc关于@Html. DropDownListFor() 或@Html.EnumDropDownListFor() 设置disabled="disabled" post(代
ASP.NET @Html.DropDownListFor() 选择的值设置为 true 但提交给控制器时返回 false
Html.DropDownListFor() 二级联动 ($.getJSON)