C# C MVC在SQL数据库表中搜索多列

C# C MVC在SQL数据库表中搜索多列,c#,sql,asp.net-mvc,database,visual-studio-2013,C#,Sql,Asp.net Mvc,Database,Visual Studio 2013,以下是我现有的代码: MobileDatas/Index.cshtml @using (Html.BeginForm("Index", "MobileDatas", FormMethod.Get)) { <p> Manufacturer: @Html.DropDownList("searchGenre", "All") Filter By: @Html.TextBox("SearchString") <br /&g

以下是我现有的代码:

MobileDatas/Index.cshtml

    @using (Html.BeginForm("Index", "MobileDatas", FormMethod.Get))
     {
     <p>
         Manufacturer: @Html.DropDownList("searchGenre", "All")
         Filter By: @Html.TextBox("SearchString") <br />
         <input type="submit" value="Filter" />
    </p>
     }
大家好

我很难找到/想出解决我问题的办法。我正在尝试根据DropDownList中选择的列搜索我的表并返回结果

例如:制造商选择+索尼类型

结果应该显示:3索尼Z1橙色

目前,我的代码用于第一个if语句ifGenreLst.ContainsConvert.ToStringitem1

编辑:

发现上面的代码正在中断,因为这些项总是在GenreList中


如何返回所选项目以与项目1进行比较?

在这里,我重新创建了您的视图并添加了foreach循环,以便打印输出

@model IEnumerable<stack.Controllers.Mobiles>

@using (Html.BeginForm("Index", "Home", FormMethod.Get))
{
    <p>
        Manufacturer: @Html.DropDownList("searchGenre", "All")
        Filter By: @Html.TextBox("SearchString") <br />
        <input type="submit" value="Filter" />
    </p>
}

@if (Model != null || Model.Any())
{
    foreach (var item in Model)
    {
        <p>@item.ID | @item.Manufacturer | @item.Model | @item.NetworkType </p>
    }    
}
你需要做什么

k => k.Manufacturer.Contains(searchString)
接下来,我把一切都保持原样,这样你就可以很容易地理解了。我刚刚增加了一个手机类,这样我可以重现你的情况

public class Mobiles
    {
        public int ID { get; set; }

        public string Manufacturer { get; set; }

        public string Model { get; set; }

        public string NetworkType { get; set; }
    }

    public class HomeController : Controller
    {
      public ActionResult Index(string searchGenre, string searchString)
    {
        string item1 = "Manufacturer";
        string item2 = "Model";
        string item3 = "NetworkType";
        var GenreLst = new List<string> { item1, item2, item3, };
        List<Mobiles> Mobs = new List<Mobiles>(){
            new Mobiles() { ID = 1, Manufacturer = "Samsung", Model = "S4", NetworkType = "Orange" },
            new Mobiles(){  ID = 2, Manufacturer = "Nokia", Model ="X1", NetworkType ="O2"},
            new Mobiles(){ ID = 3, Manufacturer = "Sony", Model = "Z1", NetworkType = "Orange"}
        };


        var filterresults = from m in Mobs
                            select m;
        ViewBag.searchGenre = new SelectList(GenreLst);

        // ToLower for case
        if (!String.IsNullOrEmpty(searchGenre))
        {
            switch (searchGenre)
            {
                case "Manufacturer":
                    filterresults = filterresults.Where(k => k.Manufacturer.Contains(searchString));
                    break;
                case "Model":
                    filterresults = filterresults.Where(x => x.Model.Contains(searchString));
                    break;
                case "NetworkType":
                    filterresults = filterresults.Where(v => v.NetworkType.Contains(searchString));
                    break;
                default:
                    // Something defaulty if you want.
                    break;
            }
        }

        return View("Index", filterresults);
    }
}
最后一句话: 这一切都在我这边起作用。我建议使用ViewModel而不是ViewBag,这样生活会更轻松。然后可以将所有表单变量存储在其中

编辑:看这里 字符串item1=制造商; 字符串item2=模型; string item3=网络类型

查看GenreLst中的网络类型如果将其作为NetworkType,则需要删除item3上的空格


我添加了一个交换机结构。。只是为了让它更具可读性和更好。

您可以通过在顶部执行NullOrEmpty检查来节省大量代码,一次在您的操作中,searchGener应该包含用户在ddmenu中选择的任何内容,searchstring将是文本内容。你可以使用适当的变量。嗨,杰德尔谢谢你的回答,我试着添加了你建议的元素。我更正了filterresults=filterresults。其中k=>k.Manufacturer.containssearch字符串;我错过了一个好机会:我仍然无法按型号或网络显示进行搜索。我不确定您是否看到我对下面一行ifGenreLst.ContainsConvert.ToStringitem1的编辑,我认为问题是由GenreLst始终包含项引起的。但是我不知道如何解决这个问题,通常我会使用dropdownbox.selecteditem-type属性,但这在mvc中不是一个选项。有什么想法吗?@Baggerz我已经设法修复了它,我发布了更新的代码。我在底部详述了这些问题。我希望我能让你读得懂。但一切都是有效的。按钮行表示您没有使用SearchGene字符串来更改要搜索的内容。您只是在检查类型列表中是否包含item1,所以它总是检查模型,而不是其他字段。对不起,我忽略了这个。现在一切都对我有用了
filterresults = filterresults.Where(k=>Manufacturer.Contains(searchString));
k => k.Manufacturer.Contains(searchString)
public class Mobiles
    {
        public int ID { get; set; }

        public string Manufacturer { get; set; }

        public string Model { get; set; }

        public string NetworkType { get; set; }
    }

    public class HomeController : Controller
    {
      public ActionResult Index(string searchGenre, string searchString)
    {
        string item1 = "Manufacturer";
        string item2 = "Model";
        string item3 = "NetworkType";
        var GenreLst = new List<string> { item1, item2, item3, };
        List<Mobiles> Mobs = new List<Mobiles>(){
            new Mobiles() { ID = 1, Manufacturer = "Samsung", Model = "S4", NetworkType = "Orange" },
            new Mobiles(){  ID = 2, Manufacturer = "Nokia", Model ="X1", NetworkType ="O2"},
            new Mobiles(){ ID = 3, Manufacturer = "Sony", Model = "Z1", NetworkType = "Orange"}
        };


        var filterresults = from m in Mobs
                            select m;
        ViewBag.searchGenre = new SelectList(GenreLst);

        // ToLower for case
        if (!String.IsNullOrEmpty(searchGenre))
        {
            switch (searchGenre)
            {
                case "Manufacturer":
                    filterresults = filterresults.Where(k => k.Manufacturer.Contains(searchString));
                    break;
                case "Model":
                    filterresults = filterresults.Where(x => x.Model.Contains(searchString));
                    break;
                case "NetworkType":
                    filterresults = filterresults.Where(v => v.NetworkType.Contains(searchString));
                    break;
                default:
                    // Something defaulty if you want.
                    break;
            }
        }

        return View("Index", filterresults);
    }
}