Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc Html.DropDownListFor未选择值_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

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