Asp.net mvc ASP MVC多下拉列表搜索表单

Asp.net mvc ASP MVC多下拉列表搜索表单,asp.net-mvc,model-view-controller,dynamic,html.dropdownlistfor,Asp.net Mvc,Model View Controller,Dynamic,Html.dropdownlistfor,我正在尝试使用具有多个dropdownlist的表单执行搜索。为了限制搜索值,dropdownlist通过viewmodel填充 视图模型:PesquisaHomeViewModel.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using MinisPT.Models; namespace MinisPT.ViewModels { public c

我正在尝试使用具有多个dropdownlist的表单执行搜索。为了限制搜索值,dropdownlist通过viewmodel填充

视图模型:PesquisaHomeViewModel.cs

using System; 
using System.Collections.Generic; 
using System.Linq;
using System.Web; 
using MinisPT.Models;

namespace MinisPT.ViewModels {
     public class PesquisaHomeViewModel
     {
        public List<Marca> Marcas { get; set; }       
         public List<Modelo> Modelos { get; set; }
         public List<EstadoProduto> EstadosProdutos { get; set; }
     } 
}
wich调用视图ResultadosPesquisa/Index.cshtml,我希望稍后显示结果:

@model IEnumerable<MinisPT.Models.Anuncio>

... (html stuff in here) 

<table>
    <tr>
        <th>
            Marca
        </th>
        <th>
            Modelo
        </th>
        <th>
            Estado
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(a => item.Marca.MarcaNome)
        </td>
        <td>
            @Html.DisplayFor(a => item.Modelo.ModeloNome)
        </td>
        <td>
            @Html.DisplayFor(a => item.EstadoProduto.EstadoProdutoTipo)
        </td>
    </tr>
}

</table>
@model IEnumerable
... (这里是html文档)
马卡
摩洛
埃斯塔多
@foreach(模型中的var项目){
@DisplayFor(a=>item.Marca.MarcaNome)
@DisplayFor(a=>item.Modelo.ModeloNome)
@DisplayFor(a=>item.EstadoProduto.estadoprodutipo)
}
*我的问题是*如果我在所有3个下拉列表上都设置了值,那么对ResultadosPesquisaController的查询只会得到结果,如果我只在其中一个下拉列表中选择了一个值,则不会返回任何结果,但我想让所有下拉列表都是可选的,我如何实现这一点

我想到了一种可能的方法,使用LINQ动态查询库

这样,我就可以在第一个索引操作上构造查询,使用一堆if语句(不是很优雅)并重定向到第二个操作,在那里我将使用带有动态LINQ的预构建查询并执行它

如果有更优雅的方式来完成这个,请告诉我


谢谢。

按照您的Linq结构,它就像一个
&
操作一样堆叠。您需要将其更改为:

var query = from m in db.Anuncios.Include(a => a.Marca).Include(a => a.Modelo)
            where m.Marca.MarcaNome == Marcas ||
                m.Modelo.ModeloNome == Modelos ||
                m.EstadoProduto.EstadoProdutoTipo == EstadosProdutos
            select m
这将返回任何选择的结果

编辑:
根据下面的注释,您最好使用扩展方法来堆叠它们。由于这是一个数据上下文(我的假设基于
db.Anuncios
),这些调用将被推迟到实际使用为止

var query = from m in db.Anuncios.Include(a => a.Marca).Include(a => a.Modelo)
            select m;

if (!string.IsNullOrWhitespace(Marcas))
    query = query.Where(m => m.Marca.MarcaNome == Marcas);

if (!string.IsNullOrWhitespace(Modelos))
    query = query.Where(m => m.Modelo.ModeloNome == Modelos);

if (!string.IsNullOrWhitespace(EstadoProdutoTipo))
    query = query.Where(m => m.EstadoProduto.EstadoProdutoTipo == EstadosProdutos);

不管m是什么,最终结果仍然是一个
IQueryable
,但是因为where子句在实际调用之前不会被添加。这可以通过您使用的查询语法来完成,但它会变得非常丑陋和复杂。这看起来更干净,更易于维护。

谢谢您的快速回复Joel,它确实返回了任何选择,但问题是它单独返回结果,我希望它们像这样堆叠在一起:第一个dll的值“Marcas”=a,第二个dll的值“Modelos”=B,所以结果必须有Marca A和Modelo B(顺便说一句,Marca表示Maker,Modelo表示model),所以我们不能用我喜欢的方式来解决它。@Ricardo_Rodrigues:所以如果我理解正确,如果你只选择了一个下拉列表,你希望它返回那个下拉列表,但是如果你选择了两个下拉列表,你只希望它返回两个。你们希望能够以任意顺序选择3中的任意一组。谢谢@Joel,你们提供的解决方案解决了我的问题。
var query = from m in db.Anuncios.Include(a => a.Marca).Include(a => a.Modelo)
            where m.Marca.MarcaNome == Marcas ||
                m.Modelo.ModeloNome == Modelos ||
                m.EstadoProduto.EstadoProdutoTipo == EstadosProdutos
            select m
var query = from m in db.Anuncios.Include(a => a.Marca).Include(a => a.Modelo)
            select m;

if (!string.IsNullOrWhitespace(Marcas))
    query = query.Where(m => m.Marca.MarcaNome == Marcas);

if (!string.IsNullOrWhitespace(Modelos))
    query = query.Where(m => m.Modelo.ModeloNome == Modelos);

if (!string.IsNullOrWhitespace(EstadoProdutoTipo))
    query = query.Where(m => m.EstadoProduto.EstadoProdutoTipo == EstadosProdutos);