Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用下拉列表和ViewData进行过滤_C#_Visual Studio 2010_Asp.net Mvc 4_Drop Down Menu_Filter - Fatal编程技术网

C# 使用下拉列表和ViewData进行过滤

C# 使用下拉列表和ViewData进行过滤,c#,visual-studio-2010,asp.net-mvc-4,drop-down-menu,filter,C#,Visual Studio 2010,Asp.net Mvc 4,Drop Down Menu,Filter,我一直在论坛上四处寻找,试图用下拉列表过滤我的索引页面 这是我想到的 首先,我的控制器如下所示: 公共操作结果索引(字符串搜索字符串) { var projects=数据库中的s。项目选择s; var themeList=db.Theme.ToList(); var projectList=db.Project.ToList(); if(Request.Form[“FilterTheme”]!=null&&Request.Form[“FilterTheme”]!=“”) { inti=int.P

我一直在论坛上四处寻找,试图用下拉列表过滤我的索引页面

这是我想到的

首先,我的控制器如下所示:

公共操作结果索引(字符串搜索字符串) { var projects=数据库中的s。项目选择s; var themeList=db.Theme.ToList(); var projectList=db.Project.ToList(); if(Request.Form[“FilterTheme”]!=null&&Request.Form[“FilterTheme”]!=“”) { inti=int.Parse(Request.Form[“FilterTheme]”); projects=来自数据库中的s.Project 来自s.Themes中的c 其中c.ThemeID==i 选择s; } if(Request.Form[“Styles”]!=null&&Request.Form[“Styles”]!=“”) { inti=int.Parse(Request.Form[“Styles”]); projets=从数据库项目中的s开始 其中s.ID==i 选择s; } ViewData[“Theme”]=新的选择列表(themeList、“ThemeID”、“Name”); ViewData[“样式”]=新的选择列表(项目列表,“ID”、“样式”); 返回视图(项目); } 视图看起来像:

@使用(Html.BeginForm())
{
项目名称:
主题:


@Html.DropDownList(“FilterTheme”,(SelectList)ViewData[“Theme”],“选择主题”,新建{onchange=“this.form.submit()”) 风格:

@Html.DropDownList(“样式”,(SelectList)ViewData[“样式”],“选择样式”,新建{onchange=“this.form.submit()”) 日期: ... }
终于成功了


现在,如果我想删除样式下拉列表中的重复项,那该怎么做呢???

您不应该对DropDownList第一个参数和ViewData使用相同的名称。在您的情况下,您使用了两次
样式
,这是错误的。您应该使用单独的名称:

@Html.DropDownList(
    "SelectedStyle", 
    (SelectList)ViewData["Styles"], 
    "Select a style", 
    new { onchange = "this.form.submit()" }
)
和您的控制器:

public ActionResult Index(int? filterTheme, int? selectedStyle)
{
    var projects = from s in db.Project select s;

    if (filterTheme != null)
    {
        projects = from s in db.Project
                   from c in s.Themes
                   where c.ThemeID == filterTheme.Value
                   select s;             
    }

    if (selectedStyle != null)
    {
        projects = from s in projects
                   from c in s.Style
                   where s.ID == selectedStyle.Value
                   select s;
    }

    ViewData["Theme"] = new SelectList(db.Theme.ToList(), "ThemeID", "Name");
    ViewData["Styles"] = new SelectList(db.Project.ToList(), "ID", "Style");

    return View(projects);
}

让我们从显而易见的事情开始,你需要更好地命名你的对象,如果你有,你会很快看到这个显而易见的问题,看看:

    /*if (Request.Form["Style"] != null && Request.Form["Style"] != "")
    {
        int i = int.Parse(Request.Form["Style"]);
        projets = from s in db.Project
                  from c in s.Style
                  where s.ID == i
                  select s;
    }*/
您正在设置i=style,但您正在对照项目id进行检查,此处使用重命名是您当前拥有的:

    if (Request.Form["Style"] != null && Request.Form["Style"] != "")
    {
        int styleID = int.Parse(Request.Form["Style"]);
        projects = from projects in db.Project
                  from styles in projects.Style
                  where projects.ID == styleID
                  select projects;
    }
我猜这就是你真正想要的:

    if (Request.Form["Style"] != null && Request.Form["Style"] != "")
    {
        int styleID = int.Parse(Request.Form["Style"]);
        projects = (from projects in db.Project
                  where projects.StyleID == styleID
                  select projects).Distinct();
    }
根据要求,我在其中添加了一个.Distinct()来删除重复项。以下是一些资源:


您是否查看过主题与样式下拉列表的不同之处。一切看起来都一样我唯一能想到的就是检查以确保
ViewData[“Style”]
有数据并且不是
null
,这是我想到的第一件事..我之前检查过,ViewData正确返回了所选值。但是,它不会按我希望的方式过滤。我很确定我遗漏了一些重要的东西:没错,我的问题中有一个拼写错误。我一直在用和你提到的完全相同的方法,但是它没有按照我想要的方式过滤。当我选择一个样式时,它总是返回所有项目的列表。你的过滤器可能是错误的。我已经用一个示例控制器操作更新了我的答案。我尝试使用了你刚才提到的,它看起来可能是答案,但它不是我想要做的。我使用了你的主题过滤器,看看它是否能工作,什么都没有发生。它总是返回给我所有项目的列表。我的方法已经适用于主题,所以我将保持这种方式。谢谢你的帮助,你真的让我在脑海中完成了。我成功了!现在,如果我想删除样式下拉列表中的重复项,那该怎么办?嗨,迈克,在这里你不能选择:where styles.ID==styleID,因为在这种情况下我不能接受styles.ID。奇怪。我以为Id是样式表上的一列,不是吗?不管是哪种方式,您似乎不太可能想要project.Id==styleID.Style不是一个表,而是项目表中的一个值。我试图做的是按所选样式过滤项目列表。让我更新我答案的最后一部分。如果我理解正确的话,看看这是否有效,听起来你甚至不需要第二次连接。我知道你在做什么。但是,因为样式不是表,而是表项目的值,它没有ID,这就是为什么弄清楚它很奇怪的原因。