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&lt;SelectListItem&gt;ViewBag 属性。但是&lt;select&gt; 元素不能绑定到复杂对象的集合(只能是值类型) 天哪,如果不是这个答案,我会浪费一整天的时间。说真的,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&lt;SelectListItem&gt;

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

一旦我将@Html.DropDownListFor 添加到表单中,Jquery.Validate 就会停止验证任何控件

为什么DropDownListFor的默认值无法正常工作?

Asp.Net MVC中DropDownListFor的用法(转)