【问题标题】:Html.DropDownListFor does not select valueHtml.DropDownListFor 不选择值
【发布时间】:2013-08-23 03:24:52
【问题描述】:

我有一个action,它检索数据并将其发送到view。在一个视图中,我有两个下拉菜单。

第一个下拉菜单显示称呼(例如“先生”、“女士”等),并且由于某种原因未选择我发送的值。另一个下拉列表显示语言列表并正确选择我发送到视图的值。视图中的相关代码如下所示。

@Html.DropDownListFor(model => model.Salutation, ViewBag.salutation as IEnumerable<SelectListItem>)

@Html.DropDownListFor(model => model.Language, ViewBag.languages as IEnumerable<SelectListItem>)

在控制器中,我有以下代码来获取下拉数据。

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

var languages = (from l in db.Languages.ToList()
                         select new SelectListItem()
                         {
                             Text = l.Language,
                             Value = l.LanguageId.ToString()
                         }).ToList();
        languages.Insert(0, new SelectListItem() { Text = "", Value = "" });
        ViewBag.languages = languages;

我能想到的唯一区别是语言下拉菜单有一个整数作为值,而称呼下拉菜单有文本作为值。这就是称呼下拉菜单不起作用的原因吗?我知道我可以检查每个称呼 List&lt;SelectListItem&gt; 项目并根据我从数据库中检索到的值设置 Selected 属性。但我希望有一种更清洁的方法来做到这一点。

有什么想法吗?

谢谢

更新

我决定做我为另一个项目所做的事情。

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;

foreach 循环之后,我在_salutation 中输出.Value.Selected 中每个项目的属性,并在选择一个项目的情况下获得所有正确的值。在视图中,我执行了以下操作。

        @foreach (var item in ViewBag.salutation as IEnumerable<SelectListItem>)
        {
            <b>@item.Value : @item.Text : @item.Selected</b><br />
        }

所有正确的文本/值都出现了,但没有一个被选中!如果我在执行@Html.DropDownListFor() 后输出值,就会发生这种情况。如果我在 html 帮助器之前输出 ViewBag.salutation,则选择了正确的值。

解决方案

我发现以下文章很有用:DropDownListFor with ASP.NET MVC

我没有使用ViewBag,而是在 ViewModel 中添加了以下内容。 (显示称呼下拉的部分。)

public class TheViewModel
{
    private IList<string> _salutations = new List<string>() { "", "Mr.", "Ms.", "Mrs." };

    public IEnumerable<SelectListItem> SalutationItems
    {
        get
        {
            var salutations = _salutations.Select(s => new SelectListItem { Value = s, Text= s });
            return salutations;
        }
    }
    // The rest of the ViewModel
}

View 我有以下内容。

@Html.DropDownListFor(model => model.Salutation, Model.SalutationItems)

【问题讨论】:

  • 你想做什么我不明白你的逻辑,你从模型中放置下拉列表,也从viewBag中传递,你可以设置salutation的模型属性并将模型传递给视图,然后将无需放入 ViewBag
  • ViewBag 包含下拉列表的数据(可能是许多项目,因为它是语言的情况),在我的模型中,每个下拉列表都有一个值 - 这些来自数据库 - 这就是我要选择。一个下拉菜单有效,另一个无效。
  • 你想做什么,我不清楚,为什么你同时使用模型和视图包,为什么不做一件事?
  • 究竟有什么不清楚的地方?该模型表示从数据库中选择的字段,其中有很多。我使用 ViewBag 填充两个下拉菜单,以免污染我的模型。
  • 您可以在这种情况下使用视图模型并将称呼的属性添加为 list 并且您可以从数据库中获取值并将其设置在视图模型中,然后将该视图模型传递给您的视图,,isn这不是正确的方法吗?

标签: asp.net-mvc asp.net-mvc-4


【解决方案1】:

除了将列表提供给DropDownListFor 助手之外,您还可以提供SelectListSelectList 构造函数采用列表并允许您显式设置所选值以及允许您指定 Text 和 Value 字段的重载。

@Html.DropDownListFor(model => model.Salutation,
                      new SelectList(ViewBag.salutation as IEnumerable<SelectListItem>,
                                     "Value", "Text", Model.Salutation))

【讨论】:

  • 第一个参数和第三个参数有什么区别?
  • 这会为每个条目使用"System.Web.Mvc.SelectListItem" 填充下拉列表。但我认为这非常接近。
  • 尝试使用其他重载来指定列表的文本和值字段。
  • 填充字段但不选择值。
  • 我想我以前遇到过这样的事情。模型值等于其中一项,但由于某种原因它不会选择它。我相信我最终创建了一个帮助器或便利方法,它创建了 SelectList 并明确设置列表中项目的 Selected 属性,其值等于我传递给帮助器或便利方法的值。
【解决方案2】:

试试这个,

@Html.DropDownListFor(m =>m.DDCountryModel,IEnumerable<SelectListItem>)ViewBag.salutation)

@Html.DropDownListFor(model => model.Language, IEnumerable<SelectListItem>)ViewBag.languages)

你的模型应该是这样的,

 public class Model
{
public IEnumerable<SelectListItem> DDCountryModel{ get; set; }
public IEnumerable<SelectListItem> Language{ get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多