Filter search with Checkbox values

1

For example, the user entered the title of a publication, and marked the genres Action and Adventure, or the user did not enter any title, but want to see all the publications that fit into these genres. How can I do this search query?

My tables:

Publicacao
Generos
PublicacaoGenero(IdPublicacao e IdGenero)

Action:

public ActionResult Publicacoes(PesquisaPublicacoesViewModel viewModel = null)
        {
            if (viewModel == null)
            {
                PesquisaPublicacoesViewModel p = new PesquisaPublicacoesViewModel();
                p.TodosOsGeneros = db.Generos.ToList();
                p.PublicacoesSelecionadas = db.Publicacao.Where(x => x.Titulo.StartsWith(p.Titulo) && x.Aprovado).ToList();
                return View(p);

            }

            viewModel.TodosOsGeneros = db.Generos.ToList();


            if (string.IsNullOrEmpty(viewModel.Titulo))
            {
                viewModel.PublicacoesSelecionadas = db.Publicacao.Where(p => p.Aprovado).ToList();

            }
            else
            {
                viewModel.PublicacoesSelecionadas = db.Publicacao.Where(p => p.Titulo.StartsWith(viewModel.Titulo) && p.Aprovado).ToList();

            }

            return View(viewModel);
        }

View:

@model AllFiction.ViewModels.PesquisaPublicacoesViewModel

@using(Html.BeginForm("Publicacoes","Publicacoes",FormMethod.Get))
{

@Html.TextBox("Titulo", null, new {id="txtTitulo" })


@Html.CheckBoxListFor(model => model.IdGenerosSelecionados,
                        model => model.TodosOsGeneros,
                        genero => genero.IdGenero,
                        genero => genero.Genero,
                        model => model.GenerosSelecionados)

}

@foreach (var p in Model.PublicacoesSelecionadas)
{
    @p.Usuario1.NomeCompleto
    @p.Titulo
}

ViewModel

public class PesquisaPublicacoesViewModel
    {

        public string Titulo { get; set; }

        public IEnumerable<Publicacao> PublicacoesSelecionadas { get; set; }

        public string[] IdGenerosSelecionados { get; set; }
        public IList<Generos> TodosOsGeneros;
        public IList<Generos> GenerosSelecionados;

    }
    
asked by anonymous 17.11.2014 / 00:48

1 answer

2

When the ViewModel is sent to the Controller , there are two ways to get the Ids of the selected genres:

  • Through property IdGenerosSelecionados ;
  • Through the GenerosSelecionados collection.

To get the IDs of GenerosSelecionados , you can use something like this:

var ids = viewModel.GenerosSelecionados.Select(g => g.GeneroId).ToList();

Using one or the other, the query looks like this:

viewModel.PublicacoesSelecionadas = db.Publicacao.Where(p => p.Aprovado && viewModel.IdGenerosSelecionados.Contains(p.PublicacaoGenero.GeneroId)).ToList();

Or:

viewModel.PublicacoesSelecionadas = db.Publicacao.Where(p => p.Aprovado && ids.Contains(p.PublicacaoGenero.GeneroId)).ToList();

It's up to you the way you prefer to use it. Do not forget to load PublicacaoGenero using Include() .

Ah, another thing: you can rewrite your Controller like this:

    public ActionResult Publicacoes(PesquisaPublicacoesViewModel viewModel = null)
    {
        if (viewModel == null)
        {
            PesquisaPublicacoesViewModel p = new PesquisaPublicacoesViewModel();
            p.TodosOsGeneros = db.Generos.ToList();
            p.PublicacoesSelecionadas = db.Publicacao.Where(x => x.Titulo.StartsWith(p.Titulo) && x.Aprovado).ToList();
            return View(p);
        }

        viewModel.TodosOsGeneros = db.Generos.ToList();
        viewModel.PublicacoesSelecionadas = db.Publicacao.Include(p => p.PublicacaoGenero).Where(p => p.Aprovado).ToList();

        if (viewModel.GenerosSelecionados != null && viewModel.GenerosSelecionados.Any()) {
            var ids = viewModel.GenerosSelecionados.Select(g => g.GeneroId).ToList();
            viewModel.PublicacoesSelecionadas = db.Publicacao.Where(p => viewModel.IdGenerosSelecionados.Contains(p.PublicacaoGenero.GeneroId)).ToList();
        }

        if (!string.IsNullOrEmpty(viewModel.Titulo))
        {
            viewModel.PublicacoesSelecionadas = viewModel.PublicacoesSelecionadas.Where(p => p.Titulo.StartsWith(viewModel.Titulo)).ToList();
        }

        return View(viewModel);
    }

PS: I have not tested this code. Some variation may occur.

    
17.11.2014 / 01:09