我收到错误"没有类型'IEnumerable <SelectListItem>'的ViewData项

Sat*_*ish 1 c# asp.net-mvc

我收到一个错误"没有'IEnumerable'类型的ViewData项,其中包含'TIMEZONE'键."

视图

        <%@ 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")%>
Run Code Online (Sandbox Code Playgroud)

调节器

ViewData["TIMEZONE"] = new SelectList(EventModel.getTIMEZOMES, "Key", "Value");
return View();
Run Code Online (Sandbox Code Playgroud)

型号页面

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;
            }
        }
Run Code Online (Sandbox Code Playgroud)

Plz给出解决方案.

Dar*_*rov 5

您不应使用相同的属性将下拉列表绑定到选择列表.他们应该是截然不同的 第一个参数必须表示标量属性,该属性将用作生成的选择的名称.第二个参数必须是列表:

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

这将使用包含的集合ViewData["TIMEZONE"]生成如下所示的选择:

<select name="SelectedTimeZone">
    <option value="1">zone 1</option>
    ...
</select>
Run Code Online (Sandbox Code Playgroud)

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

这就是说我注意到你的视图是强类型的某些模型:

Inherits="System.Web.Mvc.ViewPage<EventListing.Models.EventInfo>"
Run Code Online (Sandbox Code Playgroud)

但是在返回此视图时,您没有传递任何模型:

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

所以我建议你使用一个视图模型:

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

    // ... include some other properties that might be
    // needed by this view
}
Run Code Online (Sandbox Code Playgroud)

然后让您的控制器操作填充此视图模型:

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

最后在强类型视图中使用强类型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"
) %>
Run Code Online (Sandbox Code Playgroud)