c# - 我收到错误 "There is no ViewData item of type ' IEnumerable<SelectListItem>'

标签 c# asp.net-mvc

我收到错误消息“不存在具有键‘TIMEZONE’的‘IEnumerable’类型的 ViewData 项”。

查看

        <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<EventListing.Models.EventInfo>" %>               
        <%= Html.DropDownList("TIMEZONE", (IEnumerable<SelectListItem>)ViewData["TIMEZONE"], "Select Timezone")%>

Controller

ViewData["TIMEZONE"] = new SelectList(EventModel.getTIMEZOMES, "Key", "Value");
return View();

模型页面

public static IList<KeyValuePair<string, string>> getTIMEZOMES
        {
            get
            {
                Dbhelper DbHelper = new Dbhelper();
                IList<KeyValuePair<String, String>> Timezone = new List<KeyValuePair<String, String>>();
                DbCommand cmd = DbHelper.GetSqlStringCommond("SELECT * FROM TMP_TIMEZONES");
                DbDataReader Datareader = DbHelper.ExecuteReader(cmd);
                while (Datareader.Read())
                {
                    Timezone.Add(new KeyValuePair<String, String>(Datareader["ABBR"].ToString(), Datareader["NAME"].ToString()));
                }

                return Timezone;
            }
        }

请给出解决方案。

最佳答案

您不应使用相同的属性将下拉列表绑定(bind)到选择列表。它们应该是不同的。第一个参数必须代表一个标量属性,它将用作生成的选择的名称。第二个参数必须是列表:

<%= Html.DropDownList(
    "SelectedTimeZone", 
    (IEnumerable<SelectListItem>)ViewData["TIMEZONE"], 
    "Select Timezone"
) %>

这将使用 ViewData["TIMEZONE"] 中包含的集合来生成这样的选择:

<select name="SelectedTimeZone">
    <option value="1">zone 1</option>
    ...
</select>

提交表单后,您将在请求中查找 SelectedTimeZone 属性以获取相应的选定值。

话虽如此,我注意到您的 View 对某些模型是强类型的:

Inherits="System.Web.Mvc.ViewPage<EventListing.Models.EventInfo>"

但是在返回这个 View 时你没有传递任何模型:

ViewData["TIMEZONE"] = new SelectList(EventModel.getTIMEZOMES, "Key", "Value");
return View(); // <!-- where is the Model???

所以我建议您使用 View 模型:

public class MyViewModel
{
    public SelectList TimeZones { get; set; }
    public string SelectedTimeZone { get; set; }

    // ... include some other properties that might be
    // needed by this view
}

然后让您的 Controller 操作填充此 View 模型:

public ActionResult Index()
{
    var model = new MyViewModel
    {
        TimeZones = new SelectList(EventModel.getTIMEZOMES, "Key", "Value")
    };
    return View(model);
}

最后在您的强类型 View 中使用强类型的 DropDownListFor 助手:

<%@ Page 
    Title="" 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<EventListing.Models.MyViewModel>" 
%>

<%= Html.DropDownListFor(
    x => x.SelectedTimeZone, 
    Model.TimeZones, 
    "Select Timezone"
) %>

关于c# - 我收到错误 "There is no ViewData item of type ' IEnumerable<SelectListItem>',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36457470/

相关文章:

asp.net-mvc - Asp.net项目构想?

c# - Visual Studio 2010 是否会为 WPF 中的功能区提供开箱即用的支持?

c# - 在 C# 中设置基于过滤器的图形框架

c# - 访问 Microsoft.Extensions.HostingServices 时出错。无法解析 JSON 文件

javascript - MVC Bootstrap Navbar - 事件类只保留一个 <li> 元素

asp.net - AppHarbor 上的 nopCommerce。重定向循环

c# - MessageBox 按钮 - 设置语言?

c# - 矩阵秩亏,多元线性回归 Accord.NET

c# - 如何在 docker 容器内运行此 PowerShell 脚本?

javascript - 动态插入分页符