0
`//View <tr><td>Experience level</td><td><div class="editor-field"> 
        <%: Html.DropDownListFor(model => model.ExperienceLevelID, (SelectList)ViewData["Experience"], "--select--")%> 
        <%: Html.ValidationMessageFor(model => model.ExperienceLevelID) %> 
       </div></td></tr>`<tr><td>Size of Company</td><td><div class="editor-field"> 

       <%: Html.DropDownList("Value", (SelectList)ViewData["size"], "--select--")%> 

public ActionResult Create()//Controller 
    { 
     ViewBag.mode = "create";IExperienceLevelRepository expLevelResp = new ExperienceLevelRepository(); 
     IQueryable<ExperienceLevel> expLevel = expLevelResp.GetAllExperienceLevels().OrderBy(ExperienceLevel => ExperienceLevel.Name); 
     ViewData["Experience"] = new SelectList(expLevel, "ID", "Name"); 


     IEnumerable<SelectListItem> companySizes = new List<SelectListItem> 
              { 

               new SelectListItem 
                { 
                 Text = "Large Company", 
                  Value = "large" 

                } 
              }; 
     ViewData["size"] = new SelectList(companySizes, "Value", "Text"); 



     return View(); 
    } 

以上下拉列表正常工作的计算机[“经验”】但它不与大小的作品,我必须手动硬编码的大小的下拉列表和经验下拉列表从数据库填充。我得到的大小dropdownlist的错误是:没有类型'IEnumerable'具有关键'值'的ViewData项目。问题与DropDownList的MVC中

任何帮助或建议将不胜感激。

回答

3

我强烈建议您使用视图模型和强类型视图,而不是ViewData和弱类型助手,因为它们缺少Intellisense,并且是很多错误和难看视图的来源。

型号:

public class MyViewModel 
{ 
    [Required] 
    public string SelectedExperienceId { get; set; } 
    public IEnumerable<SelectListItem> Experiences { get; set; } 

    [Required] 
    public string SelectedSizeId { get; set; } 
    public IEnumerable<SelectListItem> Sizes { get; set; } 
} 

控制器:

public ActionResult Index() 
{ 
    var model = new MyViewModel 
    { 
     Experiences = new[] 
     { 
      new SelectListItem { Value = "exp1", Text = "Experience 1" }, 
      new SelectListItem { Value = "exp2", Text = "Experience 2" }, 
      new SelectListItem { Value = "exp3", Text = "Experience 3" }, 
     }, 
     Sizes = new[] 
     { 
      new SelectListItem { Value = "s1", Text = "Size 1" }, 
      new SelectListItem { Value = "s2", Text = "Size 2" }, 
      new SelectListItem { Value = "s3", Text = "Size 3" }, 
     } 
    }; 
    return View(model); 
} 

强类型的视图:

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

...  

<%= Html.DropDownListFor(
    x => x.SelectedExperienceId, 
    new SelectList(Model.Experiences, "Value, "Text"), 
    "-- Experience --" 
) %> 
<%= Html.ValidationMessageFor(x => x.SelectedExperienceId) %> 

... 

<%= Html.DropDownListFor(
    x => x.SelectedSizeId, 
    new SelectList(Model.Sizes, "Value, "Text"), 
    "-- Size --" 
) %> 
<%= Html.ValidationMessageFor(x => x.SelectedSizeId) %> 

现在,所有剩下的就是与那些从您的数据库来代替硬编码值,由将来自存储库的返回结果集映射到IEnumerable<SelectListItem>

+0

如果我想运行一个循环,比如我想从0下拉显示值200 – 2011-06-14 12:53:48

+0

@Muhammad AWAIS,在控制器动作简单地分配'大小= Enumerable.Range(1, 200).Select(x => new SelectListItem {Value = x.ToString(),Text =“Size”+ x})'。 – 2011-06-14 12:56:39

+0

thnx .. nd关于httppost我可以通过if(ModelState.IsValid) {trackdayResp.Add(trackday); trackdayResp.Save();} – 2011-06-14 12:59:03

1

这给你两种不同的方式将项目添加到SelectListItems列表。您可以使用现有集合进行绑定,也可以手动进行填充。

public List<SelectListItem> GetSomeSelectList() 
{ 
    var items = SomeCollection 
       .OrderByDescending(s => s.SomeProperty) 
       .Select(s => new SelectListItem { 
       Value = s.SomeProperty, 
       Text = s.SomeOtherProperty }) 
       .ToList(); 
    items.Insert(0, new SelectListItem { Value = "0", Text = "Some Default" }); 
    return items; 
} 

我同意Darin你应该使用视图模型,而不是viewdata。在我的情况下,我把上面的方法放到视图模型中,在我看来我称之为方法。

<%: Html.DropDownListFor(m => m.SomeProperty, Model.GetSomeSelectList()) %> 
+0

如果我想运行一个循环,例如我想显示从0到200的下拉列表中的值 – 2011-06-14 12:54:12