【问题标题】:ASP.Net MVC SelectList not 'Selecting' Correct ItemASP.Net MVC SelectList 没有“选择”正确的项目
【发布时间】:2011-06-15 17:50:39
【问题描述】:

我被要求查看一些 ASP.Net MVC 代码中的错误,并且对 SelectList 有一个(对我来说)非常奇怪的问题。

控制器生成项目的代码(返回一个SelectList的方法,一共有5个)。然后将每个 SelectList 保存到 ViewData 集合中。

List<SelectListItem> items = new List<SelectListItem>();
string yesText = "Yes";
string noText = "No";
if (ci.LCID.Equals((int)LanguageCodes.FRANCE))
{
    yesText = "Oui";
    noText = "Non";
}

SelectListItem yesItem = new SelectListItem();
yesItem.Text = yesText;
yesItem.Value = ((int)MarketingBy.Yes).ToString();
yesItem.Selected = selectedValue != null && selectedValue.Equals(int.Parse(yesItem.Value));

SelectListItem noItem = new SelectListItem();
noItem.Text = noText;
noItem.Value = ((int)MarketingBy.No).ToString();
noItem.Selected = selectedValue != null && selectedValue.Equals(int.Parse(noItem.Value));

items.Add(yesItem);
items.Add(noItem);

return new SelectList(items, "Value", "Text", yesItem.Selected ? yesItem.Value : noItem.Value);

创建时的快速“快速观察”表明一切正常:

在渲染视图时,这些值看起来仍然正常。然而,当视图加载时,列表中的第一项总是被选中。生成的 HTML 是:

<tr>
<td>Fax</td>
<td>
    <select id="MarketingByFax" name="MarketingByFax">
        <option value="134300002">Yes</option>
        <option value="134300001">No</option>
    </select>
</td>
</tr>

(为清楚起见,省略了其他值)。

有什么想法吗?或研究途径?作者坚持认为这是“直到上周”的工作(我不知道这两种方式)。

编辑:视图代码 -

<td><%: Html.DropDownList("MarketingByFax", (SelectList)ViewData["MarketingByFaxList"])%></td>

【问题讨论】:

  • 你能从你的视图中添加代码吗?您使用的是 Html.DropDownList 还是 Html.DropDownListFor?
  • Html.DropDownList 正在使用中(现在也已添加到问题中)

标签: html asp.net-mvc-2 selectlist


【解决方案1】:

这段代码在每个可以想象的方面看起来都很糟糕(当然是恕我直言)。我不知道为什么它不起作用,我也不想知道。我所能做的就是建议你如何改进它(所以如果你正在寻找关于为什么你的代码不起作用的解决方案,因为我不知道为什么你可以停止阅读这篇文章)。

所以第一个改进是去掉任何ViewData 并引入一个视图模型:

public class MyViewModel
{
    public string SelectedValue { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

然后我会有一个控制器动作来填充这个视图模型:

public ActionResult Index()
{
    var model = new MyViewModel
    {
        // I want to preselect the second value
        SelectedValue = "No",
        Items = new[]
        {
            new SelectListItem { Value = "Yes", Text = "yeap !" },
            new SelectListItem { Value = "No", Text = "nope !" },
        }
    };
    return View(model);
}

在我的强类型视图中,我只需将助手绑定到视图模型:

<%= Html.DropDownListFor(
    x => x.SelectedValue,
    new SelectList(Model.Items, "Value", "Text")
) %>

此外,如果您想使用某些枚举类型,您可能会发现 following extension method 很有用。

看看这有多容易?不再需要使用 ViewData 进行丑陋的演员表,不再需要定义任何列表并指定一些复杂的条件,...

备注:再说一遍,那只是我的 2 美分,如果你愿意,可以继续与ViewData 战斗。

【讨论】:

  • 对迟到的回复表示歉意。我同意你上面所说的大部分内容——尤其是 ViewModel/ViewData 部分。最初不是我的代码,而且 - 可悲的是 - 我无法负担完全重写它所需要的项目的时间(有问题的页面有更多关于上面的内容)......所以这在技术上是正确的答案,但不是在这种特定情况下使用的。
  • @Darin 你的答案很神奇。它们总是在我要问一个与我的问题略有相关的类似问题时出现。它解决了我的问题
【解决方案2】:

你可以试试

<%: Html.DropDownList("MarketingByFax", (IEnumerable<SelectListItem>)ViewData["MarketingByFaxList"])%>

dropdwon 有一个重载,它接受 Selectlist 类型对象的枚举,并根据列表中 selectListItems 的 Selected 属性自动设置列表的值。为此你必须设置

ViewData["MarketingByFaxList"] = items;//where item is IEnumerable<SelectListItem> or List<SelectListItem> as you used in your code

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-04
    • 2011-06-18
    • 2015-09-09
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多