通过下拉列表设置变量以限制索引视图

本文关键字:索引 视图 变量 下拉列表 设置 | 更新日期: 2024-10-20 19:11:56

我有一个Products控制器,每个产品都包含一个location属性。我希望"主页",因此"主页"控制器视图,显示产品不同位置的下拉列表。一旦选择了一个位置,我需要我的产品控制器的索引视图来只显示该位置的产品。我把它设置如下:

"主页索引视图"

@using Microsoft.AspNet.Identity
@model ListView.Controllers.AspNetProduct
...
@using (Html.BeginForm("IndexLocation", "Products", FormMethod.Get))
    {
        <p>
            Enter your location: <br />
            @Html.DropDownListFor(model => model.Location, ListView.Controllers.ProductsController.Locations)
            <button type="submit">Submit</button>
        </p>
    }

地点。产品控制器中的列表

// Location List
    public static List<SelectListItem> Locations = new List<SelectListItem>()
    {
        new SelectListItem() {Text="Beaverton-Hillsboro, OR", Value="Beaverton-Hillsboro, OR"},
        new SelectListItem() {Text="Corvallis, OR", Value="Corvallis, OR"},
        new SelectListItem() {Text="Eugene, OR", Value="Eugene, OR"},
        new SelectListItem() {Text="Medford, OR", Value="Medford, OR"},
        new SelectListItem() {Text="Portland, OR", Value="Portland, OR"},
        new SelectListItem() {Text="Salem, OR", Value="Salem, OR"},
        new SelectListItem() {Text="Tualatin, OR", Value="Tualatin, OR"},
        new SelectListItem() {Text="Vancouver, WA", Value="Vancouver, WA"},
        new SelectListItem() {Text="Wilsonville, OR", Value="Wilsonville, OR"}
    };

'产品控制器索引&IndexLocation方法'

public ActionResult IndexLocation(string location)
    {
        ViewBag.location = location;
        return View("Index");
    }
    // GET: Products
    public ActionResult Index(string category, string searchString)
    {
        string location = ViewBag.location;
        var CategoryLst = new List<string>();
        var CategoryQry = from d in db.AspNetProducts
                          orderby d.Category
                          select d.Category;
        CategoryLst.AddRange(CategoryQry.Distinct());
        ViewBag.category = new SelectList(CategoryLst);
        var aspNetProducts = db.AspNetProducts.Include(a => a.AspNetUser);
        if (!String.IsNullOrEmpty(location))
        {
            aspNetProducts = aspNetProducts.Where(a => a.Location == location);
        }
        if (!String.IsNullOrEmpty(searchString))
        {
            aspNetProducts = aspNetProducts.Where(a => a.Title.Contains(searchString));
        }
        if (!string.IsNullOrEmpty(category))
        {
            aspNetProducts = aspNetProducts.Where(a => a.Category == category);
        }
        return View(aspNetProducts.ToList());
    }

我的主页显示了带有适当选项的下拉菜单,但当我选择一个位置并按enter键时,它会尝试重定向到"产品视图",但我在查找产品索引的类别时出错:"没有类型为'IEnumerable'的ViewData项具有关键字'category'。"

这就是我的产品视图索引的开头,如果我在这个页面开始构建,它非常适合搜索,但如果我从主页开始,选择位置,然后重定向到这个视图,它就不起作用了。。

@using (Html.BeginForm("Index", "Products", FormMethod.Get))
{
    <p>
        Category: @Html.DropDownList("category", "All")
        Title: @Html.TextBox("SearchString")
        <input type="submit" value="Search" /><br />
        @Html.ActionLink("Clear Filters", "Index", "Products")
    </p>
} <br />

感谢任何帮助,因为我被卡住了

通过下拉列表设置变量以限制索引视图

代码下面的一行查找ViewBag.category:

Category: @Html.DropDownList("category", "All")

这意味着要确保您的所有控制器都必须向ViewBag.category添加一个选择列表,就像您对ViewBag.locations所做的那样,否则您将得到"没有类型为'IEnumerable'的ViewData项具有关键字'category'"的

另一个建议是使用Ajax.BeginForm在主页面上重新加载部分视图,而无需重定向