Asp.net mvc Html.DropDownListFor未选择值
我有一个Asp.net mvc Html.DropDownListFor未选择值,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我有一个操作,它检索数据并将其发送到视图。在视图中,我有两个下拉菜单 第一个下拉列表显示问候语(如“先生”、“女士”等),不选择出于某种原因发送的值。另一个下拉列表显示语言列表,并正确选择我发送到视图的值。视图中的相关代码如下所示 @Html.DropDownListFor(model=>model.saltation,ViewBag.saltation作为IEnumerable) @Html.DropDownListFor(model=>model.Language,ViewBag.langu
操作
,它检索数据并将其发送到视图
。在视图中,我有两个下拉菜单
第一个下拉列表显示问候语(如“先生”、“女士”等),不选择出于某种原因发送的值。另一个下拉列表显示语言列表,并正确选择我发送到视图的值。视图中的相关代码如下所示
@Html.DropDownListFor(model=>model.saltation,ViewBag.saltation作为IEnumerable)
@Html.DropDownListFor(model=>model.Language,ViewBag.languages作为IEnumerable)
在控制器中,我有以下代码来获取下拉数据
ViewBag.salutation = new List<SelectListItem>() {
new SelectListItem() { Text = "", Value = "" },
new SelectListItem() { Text = "Mr.", Value = "Mr." },
new SelectListItem() { Text = "Ms.", Value = "Ms." },
new SelectListItem() { Text = "Mrs.", Value = "Mrs." }
};
我能想到的唯一区别是语言下拉列表的值是整数,而称呼下拉列表的值是文本。这就是为什么称呼下拉列表不起作用的原因吗?我知道我可以检查每个称呼列表
项,并根据从数据库检索到的值设置所选
属性。但我希望有一个更干净的方法来做到这一点
有什么想法吗
谢谢
更新
我决定做我为另一个项目所做的事情
IList<SelectListItem> _salutation = new List<SelectListItem>()
{
new SelectListItem() { Value = "", Text = "" },
new SelectListItem() { Value = "Mr.", Text = "Mr." },
new SelectListItem() { Value = "Ms.", Text = "Ms." },
new SelectListItem() { Value = "Mrs.", Text = "Mrs." }
};
// I could put the following in the declaration above, but for testing purposes it's in foreach loop.
foreach (var item in _salutation)
{
// compare to what's retrieved from database
item.Selected = item.Value == _viewData.Salutation;
}
ViewBag.salutation = _salutation;
显示所有正确的文本/值,但未选择任何文本/值!如果在执行@Html.DropDownListFor()
后输出值,就会发生这种情况。如果在html助手之前输出ViewBag.saltation,则选择正确的值
解决方案
我发现以下文章很有用:
我没有使用ViewBag
而是在ViewModel中添加了以下内容。(显示“称呼”下拉列表中的部分。)
您可以为它提供一个
SelectList
,而不只是将列表提供给DropDownListFor
帮助程序。SelectList
构造函数获取列表,并允许您显式设置所选值,以及允许您指定文本和值字段的重载
@Html.DropDownListFor(model => model.Salutation,
new SelectList(ViewBag.salutation as IEnumerable<SelectListItem>,
"Value", "Text", Model.Salutation))
@Html.DropDownListFor(model=>model.sallation,
新建选择列表(ViewBag.Salation为IEnumerable,
“价值”、“文本”、型号(称呼)
您可以为其提供一个SelectList
帮助程序,而不仅仅是将列表提供给DropDownListFor
帮助程序。SelectList
构造函数获取列表,并允许您显式设置所选值,以及允许您指定文本和值字段的重载
@Html.DropDownListFor(model => model.Salutation,
new SelectList(ViewBag.salutation as IEnumerable<SelectListItem>,
"Value", "Text", Model.Salutation))
@Html.DropDownListFor(model=>model.sallation,
新建选择列表(ViewBag.Salation为IEnumerable,
“价值”、“文本”、型号(称呼)
试试这个
@Html.DropDownListFor(m =>m.DDCountryModel,IEnumerable<SelectListItem>)ViewBag.salutation)
@Html.DropDownListFor(model => model.Language, IEnumerable<SelectListItem>)ViewBag.languages)
@Html.DropDownListFor(m=>m.DDCountryModel,IEnumerable)ViewBag.saltation)
@(model=>model.Language,IEnumerable)ViewBag.languages)
你的模型应该是这样的
public class Model
{
public IEnumerable<SelectListItem> DDCountryModel{ get; set; }
public IEnumerable<SelectListItem> Language{ get; set; }
}
公共类模型
{
公共IEnumerable DDCountryModel{get;set;}
公共IEnumerable语言{get;set;}
}
试试这个
@Html.DropDownListFor(m =>m.DDCountryModel,IEnumerable<SelectListItem>)ViewBag.salutation)
@Html.DropDownListFor(model => model.Language, IEnumerable<SelectListItem>)ViewBag.languages)
@Html.DropDownListFor(m=>m.DDCountryModel,IEnumerable)ViewBag.saltation)
@(model=>model.Language,IEnumerable)ViewBag.languages)
你的模型应该是这样的
public class Model
{
public IEnumerable<SelectListItem> DDCountryModel{ get; set; }
public IEnumerable<SelectListItem> Language{ get; set; }
}
公共类模型
{
公共IEnumerable DDCountryModel{get;set;}
公共IEnumerable语言{get;set;}
}
您试图做的事情我不理解您的逻辑,您正在从模型中放置下拉列表,也从viewBag中传递,您只需将称呼和传递模型的模型属性设置为view,那么就不需要将其放入viewBag中viewBag包含下拉列表的数据(可能是许多项,因为语言就是这样)在我的模型中,每个下拉列表都有一个值——这些值来自数据库——这就是我想要选择的。一个下拉菜单有效,另一个不行。你想做什么,我不清楚,为什么你同时使用model和viewbag,为什么没有一件事?到底什么是不清楚的?该模型表示从数据库中选择的字段,其中有很多字段。我使用ViewBag填充了两个下拉菜单,以免污染我的模型。在这种情况下,您可以使用viewmodel并将称呼属性添加为list,您可以从数据库中获取值并在viewmodel中进行设置,然后将该viewmodel传递给您的视图,这不是正确的方法吗?您正在尝试的操作我不理解您的逻辑,您可以从模型中放置下拉列表,也可以从viewBag中传递,您只需将称呼和传递模型的模型属性设置为view,那么就不需要将ViewBagViewBag包含下拉列表的数据(这可能是许多项,就像语言一样)在我的模型中,每个下拉列表都有一个值——这些值来自数据库——这就是我想要选择的。一个下拉菜单有效,另一个不行。你想做什么,我不清楚,为什么你同时使用model和viewbag,为什么没有一件事?到底什么是不清楚的?该模型表示从数据库中选择的字段,其中有很多字段。我使用ViewBag填充了两个下拉菜单,以免污染我的模型。在这种情况下,您可以使用viewmodel,并将称呼属性添加为list,您可以从数据库中获取值并在viewmodel中进行设置,然后将该viewmodel传递给您的视图,,这不是正确的方法吗?第一个参数和第三个参数有什么区别?这会在下拉列表中为每个条目填充“System.Web.Mvc.SelectListItem”
。但我认为这非常接近。尝试使用其他重载指定列表的文本和值字段。它填充字段,但不选择值。我想我以前遇到过类似的情况。模型值等于其中一项,但由于某种原因,它不会选择它。我相信我最终创建了一个助手或便利方法,创建了SelectList
和
public class Model
{
public IEnumerable<SelectListItem> DDCountryModel{ get; set; }
public IEnumerable<SelectListItem> Language{ get; set; }
}