Pesquisar

Acompanhe

http://twitter.com/dfcdaniel Feed

Posts recentes

Comentários recentes

DropDownList com AJAX em ASP.NET MVC

Nesse exemplo vou demostrar como trabalhar com DropDownList e AJAX, para o AJAX vou utilizar o JQuery. Vamos ao exemplo.

Definindo o modelo

Vamos começar pelo modelo da aplicação nesse exemplo vou utilizar o bom e velho Northwind e vou trabalhar com apenas duas tabelas Categories e Products, vou utilizar EF mais se você preferir pode utilizar L2Q,NHibernate,ADO.NET, etc…

Entity Framework

Imagem 1 - Modelo da aplicação.

O diagrama acima mostra como ficou o modelo, no EF não alterei nenhuma configuração simplesmente next,next,finish.

Definindo a View,Partial View e JavaScript

Para simplificar o exemplo vou aproveitar a View “Index” do Controller “Home”, veja o código completo da View “Index” abaixo.

View Home

Imagem 2 - View Home.

Na View acima utilizo o Helper Html.DropDownList , para criar o “DropDownList” (acho estranho esse nome o correto seria chamar de “Select”, que é o nome do elemento HTML, mais acredito que isso seja herança do Web Form),os dados para popular o “DropDownList” estão no ViewData e são acessados pela chave “SelectList”, a div “partial” receberá o conteúdo da partial que vamos criar.

Note que a View “Home” possui dois arquivos JavaScript a framework JQuery “jquery-1.3.2.min.js” é o arquivo “Categoria.js” que esta definido no código abaixo.

$(document).ready(function() {
    //Assina o evento onchange do DropDownList
    $("#CategoryID").change(CategoryID_Change);
});

function CategoryID_Change() {
    //Envia o item selecionado para Action "Produto" do Controller Home
    $.post("Home/Produto", { CategoryID: $("#CategoryID").val() }, CategoryID_Callback, "Json");
}

function CategoryID_Callback(partial) {
    //Limpa o conteúdo da div
    $("#partial").empty();
    
    if (partial) {
        //adiciona o novo conteúdo
        $("#partial").append(partial);
    }
}

Dentro da função “ready” o evento “onchange” do DropDownList "CategoryID" foi assinado é toda vez que o usuário selecionar um novo item a função “CategoryID_Change” será executada, dentro da função “CategoryID_Change” uma chamada AJAX via post é criada e o alvo dessa chamada é a Action “Produto” do Controller “Home”, note que na configuração da chamada AJAX eu defini um callback que nesse exemplo será a função “CategoryID_Callback” essa função simplesmente limpa o conteúdo da div “partial” e adiciona o conteúdo recebido como parâmetro, esse conteúdo será uma partial com uma table com todos os produtos da categoria selecionada, para criar essa partial clique com o direito na pasta “Shared”, selecione "Add">>"New Item" e selecione o template "MVC View User Control", altere o nome para “PartialProduto.ascx”, veja o código completo abaixo.

Código da Partial View Produto

Imagem 3 - Código da Partial View Produto.

A partial acima contém apenas o código necessário para criação de uma table com 4 colunas, ela é tipada e para renderizar essa partial é necessário um IEnumerable de Products.

Controller Home

Veja o código atualizado do Controller “Home“ abaixo.

public class HomeController : Controller
{
    northwndEntities context = new northwndEntities();

    public ActionResult Index()
    {
        ViewData["SelectList"] = new SelectList(context.Categories, "CategoryID", "CategoryName");
        return View();
    }

    public ActionResult Produto(Categories categories)
    {
        if (ModelState.IsValid)
            return PartialView("PartialProduto",
                context.Products.Where(x => x.Categories.CategoryID == categories.CategoryID));
        else
            return new EmptyResult();
    }

    public ActionResult About() { return View(); }
}

Na Action “Index” crio um objeto SelectList com todas as categorias e adiciono esse objeto no ViewData, a Action Produto recebe o CategoryID e retorna a Partial View “PartialProduto” com todos os produtos da categoria selecionada.

Agora podemos executar o exemplo, o resultado esperado pode ser visto na imagem abaixo.

Resultado

Imagem 4 - Resultado.

Conclusão

Confesso que sinto a falta de um Helper para criar esse tipo de código, mais o exemplo acima da uma idéia de como você pode criar o seu próprio Helper para resolver esse problema, segue o código fonte em VB.NET e C#.

Daniel Fonseca Castro

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Categories: AJAX | ASP.NET MVC | JQuery

Related posts

Comments

Eduardo br

Tuesday, September 01, 2009 9:11 PM

Daniel,

No artigo de abril foi mencionado que não era funcional criar rota por javascript.

function CategoryID_Change() {
//Envia o item selecionado para Action "Produto" do Controller Home
$.post("Home/Produto", { CategoryID: $("#CategoryID").val() }, CategoryID_Callback, "Json");
}

Neste caso qual seria a forma correta de implementar.

Att.
Eduardo

Daniel Fonseca Castro

Wednesday, September 02, 2009 7:53 AM

Oi Eduardo,

Você pode por exemplo criar a rota com ajuda de um helper server side e guardar em um input hidden, assim toda vez que você tiver alguma alteração de rota o seu helper vai identificar.
É ao invés de colocar o valor fixo como no exemplo acima você utilizaria o JQuery para recuperar o valor do hidden.

Abraços,
Daniel Fonseca Castro

Felipe br

Tuesday, November 03, 2009 4:23 PM

Olá, estou utilizando o código acima para resolver um problema semelhante ao exemplo e estou tendo problemas na hora do callback... Ele não esta aceitando o meu return PartialView.. Se eu mudo para return Json("..") ele retorna blz.. mas não está retornando minha partialview.. você sabe o por que?
Obrigado.

mateus br

Thursday, February 25, 2010 12:11 PM

Daniel

Poderia me da r um Help,

o meu esta dando o seguinte erro qdo:

Descrição: Erro ao compilar um recurso necessário para atender esta solicitação. Examine os detalhes específicos do erro e modifique o código fonte apropriadamente.

Mensagem de Erro do Compilador: CS0030: Não é possível converter o tipo 'ASP.views_home_partialproduto_ascx' em 'System.Web.Mvc.ViewUserControl'

Erro de Origem:

Linha 146: [System.Diagnostics.DebuggerNonUserCodeAttribute()]
Linha 147: public views_home_partialproduto_ascx() {
Linha 148: ((global::System.Web.Mvc.ViewUserControl)(this)).AppRelativeVirtualPath = "~/Views/Home/PartialProduto.ascx";
Linha 149: if ((global::ASP.views_home_partialproduto_ascx.@__initialized == false)) {
Linha 150: global::ASP.views_home_partialproduto_ascx.@__initialized = true;

Daniel Fonseca Castro br

Friday, February 26, 2010 12:49 AM

Olá Mateus,

Pelas mensagens de erro o problema parece ser a versão do ASP.NET MVC instalada na sua maquina eu crie esse exemplo utilizando a versão 1.0!
Para resolve o problema você pode criar um projeto e adicionar as Views ,Controller e Scripts o model você gera a partir do VS , o exemplo é bem pequeno o trabalho será minimo!

Abraços,
Daniel Fonseca Castro

Add comment


 

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]