2

我試圖用一個表單執行搜索,該表單有多個dropdownlist來限制搜索值,下拉列表通過viewmodel填充。ASP MVC多個下拉列表搜索表單

視圖模型: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; } 
    } 
} 

這是與表單視圖的一部分:首頁/ Index.cshtml

@using (Html.BeginForm("Index", "ResultadosPesquisa", FormMethod.Get)) 
      { 
       @Html.ValidationSummary(true)     
       <div id="coluna1"> 
       <div class="coluna1_titulo">Marca</div> 
       <div class="coluna1_DropDownList"> 
        @Html.DropDownListFor(m => m.Marcas, new SelectList(Model.Marcas, "MarcaNome", "MarcaNome"), String.Empty) 
       </div> 
       <div class="coluna1_titulo">Modelo</div> 
       <div class="coluna1_DropDownList"> 
        @Html.DropDownListFor(md => md.Modelos, new SelectList(Model.Modelos, "ModeloNome", "ModeloNome"), String.Empty) 
       </div> 
       <div class="coluna1_titulo">Estado</div> 
       <div class="coluna1_DropDownList"> 
        @Html.DropDownListFor(e => e.EstadosProdutos, new SelectList(Model.EstadosProdutos, "EstadoProdutoTipo", "EstadoProdutoTipo"), String.Empty) 
       </div> 
       <span> 
        <input type="submit" value="Pesquisar" class="botaoPesquisa" /> 
       </span>     
      } 

正如你可以看到直通該提交,我稱之爲「ResultadosPesquisa」控制器的索引操作,在該控制器中,我使用表單的參數並嘗試對名爲「Anuncios」的模型(這意味着我的語言中的「Ads」)進行搜索。

個ResultadosPesquisaController.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Data; 
using System.Data.Entity; 
using MinisPT.Models; 
using MinisPT.ViewModels; 

namespace MinisPT.Controllers 
{ 
    public class ResultadosPesquisaController : Controller 
    { 
     MinisPTEntities db = new MinisPTEntities(); 

     // 
     // GET: /ResultadosPesquisa/ 
     public ActionResult Index(string Marcas, string Modelos, string EstadosProdutos) 
     { 
      var query = from m in db.Anuncios.Include(a => a.Marca).Include(a => a.Modelo) 
         where m.Marca.MarcaNome == Marcas 
         where m.Modelo.ModeloNome == Modelos 
         where m.EstadoProduto.EstadoProdutoTipo == EstadosProdutos 
         select m; 

      return View(query.ToList()); 
     } 
    } 
} 

至極調用視圖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> 

* 我的問題是*上ResultadosPesquisaController查詢只給我結果,如果我把值放在所有3 dropdownlists,如果我只選擇一個下拉列表中的值沒有返回,但我想使所有下拉列表可選,我如何執行此操作?

我想到了一種可能的方式,使用LINQ動態查詢庫,

using LINQ Dynamic Query Library by scott gu

這樣,我可以構建第一個索引操作的查詢,帶着一幫的if語句(不是很優雅)並重定向到第二個動作,我將使用動態LINQ的預建查詢並執行它。

如果有一個更優雅的實現方式,請告訴我。

謝謝。

回答

3

您有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); 

最終的結果將依然由IQueryable<T>無論何種m是,但因爲where子句不會被添加到它的實際調用。這可以在你使用的查詢語法中完成,但它變得非常難看和複雜。這看起來更清潔一些,更容易維護IMO。

+0

感謝您的快速回復Joel,它確實會返回任何選擇,但問題是它會單獨返回結果,我希望它們像這樣疊加togheter:第一個dll的值爲「Marcas」= A和第二個DLL的值是「Modelos」= B,所以結果必須有Marca A和Modelo B(馬卡意味着Maker和modelo意味着模型,順便說一句),所以OR's不會按照我喜歡的方式解決它。 –

+0

@Ricardo_Rodrigues:所以如果我正確理解你,如果你只選擇了1個下拉菜單,你希望它返回下拉菜單,但是如果你選擇了2個下拉菜單,那麼只有當它們兩個都是。而且你希望能夠以任意順序選擇任意一組3。 –

+0

是的,你是正確的喬伊,這就是我正在尋找的。 –