Html.DropdownListFor未设置选定值

时间:2013-10-20 10:54:42

标签: asp.net-mvc razor

如何设置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的文字,但这也不起作用。

有什么想法吗?

13 个答案:

答案 0 :(得分:160)

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

<强>第一

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

答案 1 :(得分:19)

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

控制器:

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 :(得分:6)

传递这样的对象时:

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

您说的是来源(Model)和密钥("Code")文本("Name")和所选值0。可能你的0属性的源没有Code值,因此,html帮助器将选择第一个元素。要将实际的selectedValue传递给此控件。

答案 3 :(得分: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" })

答案 4 :(得分:2)

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

在Controller文件中。

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

在.cshtml文件中。

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

答案 5 :(得分:0)

你应该忘记课程

  

的SelectList

控制器

中使用此功能
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

答案 6 :(得分:0)

添加控制器部分

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

添加Html部分

   @Html.DropDownList("Orders", null)

一种简单的方法

答案 7 :(得分: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" })
     }
}

答案 8 :(得分:0)

Linq to Dropdown with empty item,selected item(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 });

答案 9 :(得分:0)

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

我的错误是我试图从字典中创建一个SelectList:

    public MvxCommand<string> SearchContactsCommand => new MvxCommand<string>(SearchContacts);

    private void SearchContacts(string searchTerm)
    {
        // Do search
    }

然后我开始挖掘官方msdn doc,发现 <android.support.design.widget.TextInputLayout android:layout_marginTop="3dp" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" local:MvxLang="Hint SearchPlaceholder" local:MvxBind="TextChanged SearchContactsCommand" /> </android.support.design.widget.TextInputLayout> 并不一定需要//wrong! @Html.DropDownListFor(m => m.Locality, new SelectList(new Dictionary<string, string>() { { Model.Locality, Model.Locality_text } }, Model.Locality, ... ,而是DropDownListFor

SelectList

在我的情况下,我可能也会将IEnumerable<SelectListItem>省略为所选项目,因为它是a)唯一的项目,b)它已经在//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" }) 属性中说明了它。

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

答案 10 :(得分:0)

public byte UserType
public string SelectUserType

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

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

我使用Enum字典作为我的列表,这就是为什么有“key”,“value”对。

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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