MVC下拉列表,当模型不是不可数时,数据不显示

时间:2012-10-22 18:40:48

标签: asp.net-mvc-3 html.dropdownlistfor

我在查看包含下拉数据和模型的模型时遇到问题。

使用此代码加载我的页面,但下拉列表在选中时包含“System.Web.MVC.SelectList”。

这是我的控制器代码。

public ActionResult Index(string productNameFilter, string productCategoryFilter, String productTypeFilter )
{
    var ddl = new Items();
    ddl.CategoryddList = itemsRepository.GetItemDdl("Item Categories").Select(c => new SelectListItem
    {
        Value = c.DropdownID.ToString(),
        Text = c.DropdownText
    });
    ViewBag.CategoryDD = new SelectList(ddl.CategoryddList, "Value", "Text");
    var model = itemsRepository.GetItemByName(productNameFilter);
    return View(model);
}

这是我的观点

@model Ienumerable<Models.items.items>

@Html.DropDownList("productCategoryFilter", 
                   new SelectList(ViewBag.CategoryDD), 
                   "---Select Category---") 

1 个答案:

答案 0 :(得分:1)

附注 - 如果在View和Model之间使用ViewModel而不是直接绑定到模型,则可以将SelectList放在ViewModel上并使用@ Html.DropdownFor()而不是@ Html.Dropdown()。应该谨慎使用ViewBag。

然而回到原来的问题:

什么是“Items()”?在你的行

var ddl = new Items();

我不确定你有什么理由不让它可以枚举。

我怀疑它无效,因为您从选择列表中选择了两次 - 在您的代码中,您将ViewBag.CategoryDD定义为SelectList(),然后在您的Razor代码中,您将从现有选择列表中创建一个新的SelectList()。你不应该这样做。

我这样做的方法是创建一个ProductViewModel类,其中包含您的产品类别列表和产品列表(您当前的模型),以及所选过滤器的属性。

public class ProductViewModel
{
    public IEnumerable<Model.items.items> ProductList {get;set;}
    public IEnumerable<SelectListItem> ProductCategoryList {get;set;} //SelectList is an IEnumerable<SelectListItem>
    public string SelectedCategory  {get;set;}
}

然后在您的视图中,模型将是

@model ProductViewModel

@Html.DisplayFor(model => model.SelectedCategory, "---Select Category---")
@Html.DropdownListFor(model => model.SelectedCategory, Model.ProductCatgoryList)