【问题标题】:Why Html.DropDownListFor requires extra cast?为什么 Html.DropDownListFor 需要额外的演员表?
【发布时间】:2010-06-11 23:09:32
【问题描述】:

在我的控制器中,我创建了一个 SelectListItems 列表并将其存储在 ViewData 中。当我在 View 中读取 ViewData 时,它会给我一个关于不正确类型的错误。如果我手动转换类型它可以工作,但似乎这应该自动发生。谁能解释一下?

控制器

enum TitleEnum { Mr, Ms, Mrs, Dr };
var titles = new List<SelectListItem>();
foreach(var t in Enum.GetValues(typeof(TitleEnum)))
  titles.Add(new SelectListItem() 
    { Value = t.ToString(), Text = t.ToString() });

ViewData["TitleList"] = titles;

查看

// Doesn't work
Html.DropDownListFor(x => x.Title, ViewData["TitleList"])

// This Works
Html.DropDownListFor(x => x.Title, (List<SelectListItem>) ViewData["TitleList"])

【问题讨论】:

  • 在视图中使用:@Html.DropDownList("TitleList"),无需额外转换即可工作

标签: c# asp.net-mvc enums html-helper viewdata


【解决方案1】:

因为ViewDataDictionary&lt;string, Object&gt;。你怎么能在一个键控集合中存储多种类型的对象?从 ViewData 中检索到的任何内容都将被编译器视为基础 Object

【讨论】:

    【解决方案2】:

    如果我没记错的话,ViewData 是一个对象数组/集合。这就是需要额外演员的原因。

    【讨论】:

      【解决方案3】:

      显然编译器不会自动将 object 类型的对象转换为另一种类型。我希望 ViewData 的结果在编译时属于 object 类型。示例如下:

      // This Fails
      object obj = new List<SelectListItem>();
      Html.DropDownListFor(x => x.Title, obj);
      
      // This Works
      var obj2 = new List<SelectListItem>();
      Html.DropDownListFor(x => x.Title, obj2);
      

      【讨论】:

        【解决方案4】:

        这是因为一个叫做“静态类型”的特性。有些人喜欢它,有些人讨厌它。

        【讨论】:

          【解决方案5】:

          如果你改变了怎么办

          ViewData["TitleList"] = titles;
          

          ViewData["TitleList"] = new SelectListItem() 
              { Value = t.ToString(), Text = t.ToString() };
          

          然后再次尝试:

          Html.DropDownListFor(x => x.Title, ViewData["TitleList"])
          

          如果可行,我会同意 Femaref....不过是个好问题。

          【讨论】:

            猜你喜欢
            • 2014-12-02
            • 2016-09-28
            • 1970-01-01
            • 2015-08-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多