none
Cascading Dropdownlist RRS feed

  • Pergunta

  • Bom dia amigos,

    Eu tenho uma tabela de usuarios onde eu cadastro nele o código da área onde ele trabalha. na tabela de areas eu cadastro o código da empresa da qual esta área pertence.

    eu consigo, na tela de cadastro de usuarios colocar dois dropdownlists, um exibindo as empresas e outro exibindo as areas.

    O cascadingdropdownlist ainda não funciona, pois quando eu seleciono uma empresa, o dropdownlist das areas continua exibindo todas as areas.

    Mesmo assim, eu selecionei manualmente a empresa correspondente a area que eu selecionei para cadastrar no usuario novo.

    Pergunto:
    Eu coloquei o dropdownlist da empresa lá só para poder fazer o cascading, na verdade não vou gravar a informação da empresa em lugar nenhum.
    Isso é um problema na hora de gravar as informações?

    Eu não posso ter objetos que apenas exibam informações que não serão gravadas na tabela?

    Seguem os códigos de controle e view desta situação:

    Controller:
        public class UsuarioFormViewModel
        {
            // Properties
    
            public AreaRepositorio arearep = new AreaRepositorio();
            public EmpresaRepositorio empresarep = new EmpresaRepositorio();
    
            public Usuario usuarios { get; private set; }
            public Empresa Empresa = new Empresa();
            public Area Area = new Area();
    
            public SelectList cod_area { get; private set; }
            public SelectList cod_empresa { get; private set; }
    
            // Constructor
            public UsuarioFormViewModel(Usuario Usuarios)
            {
                usuarios = Usuarios;
    
                if (Usuarios.cod_area == 0 && Usuarios.cod_empresa == 0)
                {
                    cod_empresa = new SelectList(empresarep.SelecionarTodas(), "cod_empresa", "nome");
                    cod_area = new SelectList(arearep.SelecionarTodas(), "cod_area", "descricao");
                }
                else
                {               
                    cod_empresa = new SelectList(empresarep.SelecionarTodas(), "cod_empresa", "nome", usuarios.cod_empresa);
                    cod_area = new SelectList(arearep.SelecionarAreasDeEmpresa(usuarios.cod_empresa), "cod_area", "descricao", usuarios.cod_area);
                }           
                
                Empresa = empresarep.SelecionarEmpresa(usuarios.cod_empresa);
                Area = arearep.SelecionarArea(usuarios.cod_area); 
            }
        }
    

    E View:
        <% using (Html.BeginForm()) {%>
    
            <fieldset>
                <p>
                    <label for="nome">Nome:</label>
                    <%= Html.TextBox("nome", Model.usuarios.nome)%>
                    <%= Html.ValidationMessage("nome", "*") %>
                </p>
                <p>
                    <label for="endereco">Endereço:</label>
                    <%= Html.TextBox("endereco", Model.usuarios.endereco)%>
                    <%= Html.ValidationMessage("endereco", "*") %>
                </p>
                <p>
                    <label for="cod_empresa">Empresa em que trabalha:</label>
                    <%= Html.DropDownList("cod_empresa", "Empresa") %>
                    <%= Html.ValidationMessage("cod_empresa", "*") %>
                </p>
                <p>
                    <label for="cod_area">Área em que trabalha:</label>
                    <%= Html.DropDownList("cod_area", "Selecione uma area") %>                
                    <%= Html.ValidationMessage("cod_area", "*") %>
                </p>         
                <div>
                    <a href="/usuario"><img class="image" src="../../Content/img/voltar.ico" alt="Voltar aos Usuários"/></a>
                    <input class="image" type="image" src="../../Content/img/ok.ico" alt="Salvar"/>
                </div>
            </fieldset>
            
        <% } %>
    Obrigado.

    segunda-feira, 14 de setembro de 2009 14:23

Respostas

  • Vou fechar o tópico, pois meu projeto com mvc está parado.

    Quando eu precisar novamente, eu crio outro post e falo com voces.

    Obrigado pelas orientações.
    • Marcado como Resposta joaoluizbt quinta-feira, 1 de outubro de 2009 13:44
    quinta-feira, 1 de outubro de 2009 13:44

Todas as Respostas

  • Eu coloquei o dropdownlist da empresa lá só para poder fazer o cascading, na verdade não vou gravar a informação da empresa em lugar nenhum.
    Isso é um problema na hora de gravar as informações?
    Não, isso não é  nenhum problema, é só não usar esta informação, ou se você estiver fazendo o bind pode usar o "[Bind(Exclude="CampoAExcluir")]".

    Eu não posso ter objetos que apenas exibam informações que não serão gravadas na tabela?
    Pode sim, veja na resposta acima.

    Me parece que o que está faltando para você é a programação no lado do cliente, veja bem, se você quer fazer um cascading, você precisará disparar um evento quando o usuário trocar o valor do combo e fazer logo em seguida uma chamada a um método que irá retornar os valores do outro drop.

    Você poderia usar jQuery para fazer isso, ficaria mais ou menos como o código abaixo:

    <script type="text/javascript">
            $(document).ready(function() {
                $("#cod_empresa").change(function() {
                    ListaArea($(this).val());
                });
            });

            function ListaArea(cod_area) {
                $.getJSON("/home/ListaArea/" + cod_area, function(data) {
                    $("#Cod_area option:gt(0)").remove();
                    $(data).each(function() {
                        $("#cod_area").append("<option value='" + this.id + "'>" + this.nome + "</option>");
                    });
                });
            }  
        </script>

    Espero ter te ajudado,

    Abraços,

    Victor Cavalcante

    segunda-feira, 14 de setembro de 2009 19:25
  • Eu adicionei o código no formulário do usuario, mas não fez diferença nenhuma...
    este "/home/ListaArea" está apontando para onde, no seu exemplo? Para a pagina em questão, onde será criado o cascading? e o lista area, é um novo metodo que eu tenho que criar no controller?

    Se puder me explicar como funciona este código, eu agradeço muito. Não conheço de java script.

    Muito obrigado.
    segunda-feira, 14 de setembro de 2009 19:37
  • Olá João,

    Este "/home/ListaArea" é um chamado para a Action ListaArea que deverá ser criada retornando um JSON, este código não é sõ copiar e colar, vai ter que dar uma olhada e mudá-lo de acordo com a sua necessidade.

    Vou tentar fazer um exemplo mais real.

    Abraços,

    Victor Cavalcante
    segunda-feira, 14 de setembro de 2009 19:41
  • Escrevi um post que acho que vai te ajudar.
    Dá uma olhada lá: http://www.cavalcante.net/post/DropDownList-com-ASPNET-MVC-e-jQuery.aspx

    Espero ter ajudado,

    Abraços,

    Victor Cavalcante
    terça-feira, 15 de setembro de 2009 04:04
  • Entendo... vou dar uma estudada no seu link, tentando adaptar para o meu programa, mas no caso, este exemplo que voce me deu, do "/home/listaarea", ele deve fazer referencia dentro da tela onde está o formulario do usuario certo?

    Explico:

    Tenho um form para cadastrar usuario "/Usuario/Adicionar" com dois dropdownlists, um com a area onde ele trabalha e outro com a empresa que contem esta area onde ele trabalha. Eu deveria fazer algo como "/Usuario/Adicionar/ListarArea"?
    Mas aí ele vai abrir outra tela?

    Bem... vamos por partes né? vou ler seu artigo e depois te digo o que é que deu aqui...

    Valeu pela força.
    terça-feira, 15 de setembro de 2009 11:10
  • Bom... vamos lá...

    Deu o seguinte erro tentando compilar:
    Controles de conteúdo precisam ser controles de alto nível em uma página de conteúdo ou em uma página mestre aninhada que faz referência a uma página mestre.

    eu alterei os códigos da seguinte maneira: (vou colocar os códigos equivalentes aos que voce alterou ou criou no seu artigo, por favor não me mande uma carta com antrax, seja paciente com este jovem padawan. - hehehe)

    Nas classes de modelo eu tenho o seguinte:

    Modelo de Empresa.cs :
    using System;
    using System.Linq;
    using System.Web.UI.WebControls;
    using System.Collections.Generic;
    using System.Data.Linq;
    using HeraSupport.Helpers;
    
    namespace HeraSupport.Models
    {
        public partial class Empresa
        {
            public bool IsHostedBy(string userName)
            {
                return Login.Equals(userName,
                StringComparison.InvariantCultureIgnoreCase);
            }
    
            public bool IsValid
            {
                get { return (GetRuleViolations().Count() == 0); }
            }
    
            public IEnumerable<RuleViolation> GetRuleViolations()
            {
                if (String.IsNullOrEmpty(nome))
                    yield return new RuleViolation("Nome Necessário.", "nome");
                if (String.IsNullOrEmpty(endereco))
                    yield return new RuleViolation("Endereço Necessário.", "endereco");
                if (String.IsNullOrEmpty(telefone))
                    yield return new RuleViolation("Telefone Necessário.", "telefone");
                if (Int32.ReferenceEquals(cod_tipo_contrato, null))
                    yield return new RuleViolation("Tipo de contrato Necessário.", "cod_tipo_contrato");
                if (Int32.ReferenceEquals(cod_licenciada, null))
                    yield return new RuleViolation("Empresa licenciada Necessária.", "cod_licenciada");
                yield break;
            }
    
            partial void OnValidate(ChangeAction action)
            {
                if (!IsValid)
                    throw new ApplicationException("Violação de regras impediu a Gravação.");
            }
        }   
    }
    Modelo de Area.cs :(basicamente a mesma coisa - tratamento de exceções)
    using System;
    using System.Linq;
    using System.Web.UI.WebControls;
    using System.Collections.Generic;
    using System.Data.Linq;
    using HeraSupport.Helpers;
    
    namespace HeraSupport.Models
    {
        public partial class Area
        {
            public bool IsHostedBy(string userName)
            {
                    return Login.Equals(userName,
                    StringComparison.InvariantCultureIgnoreCase);
            }
    
            public bool IsValid
            {
                get { return (GetRuleViolations().Count() == 0); }
            }
    
            public IEnumerable<RuleViolation> GetRuleViolations()
            {
                if (String.IsNullOrEmpty(descricao))
                    yield return new RuleViolation("Descrição Necessária.", "descricao");
                if (Int32.ReferenceEquals(cod_empresa, null))
                    yield return new RuleViolation("Empresa Necessária.", "cod_empresa");
                yield break;
            }
    
            partial void OnValidate(ChangeAction action)
            {
                if (!IsValid)
                    throw new ApplicationException("Violação de regras impediu a Gravação.");
            }
        }
    
    }
    AGORA AS CLASSES DE REPOSITÓRIO:

    Modelo de EmpresaRepositorio.cs :
    using System.Linq;
    
    namespace HeraSupport.Models
    {
        public class EmpresaRepositorio
        {
            private HeraSupportDataContext db = new HeraSupportDataContext();
            //
            // Métodos de pesquisa
            public IQueryable<Empresa> SelecionarTodas()
            {
                return db.Empresas;
            }
    
            public IQueryable<Empresa> BuscarEmpresas(int id)
            {
                return from empresa in db.Empresas
                       where empresa.cod_empresa == id
                       orderby empresa.nome
                       select empresa;
            }
    
            public Empresa SelecionarEmpresa(int cod)
            {
                return db.Empresas.SingleOrDefault(d => d.cod_empresa == cod);
            }
            //
            // Métodos de inserção e deleção
            public void Adicionar(Empresa empresa)
            {
                db.Empresas.InsertOnSubmit(empresa);
            }
            public void Excluir(Empresa empresa)
            {
                db.Areas.DeleteAllOnSubmit(empresa.Areas);
                db.Empresas.DeleteOnSubmit(empresa);
            }
            //
            // Persistence
            public void Salvar()
            {
                db.SubmitChanges();
            }
        }
    }
    Modelo de AreaRepositorio.cs :(Destaque para o método SelecionarAreasDeEmpresa que recebe o valor inteiro do código da empresa selecionada)
    using System.Linq;
    
    namespace HeraSupport.Models
    {
        public class AreaRepositorio
        {
            private HeraSupportDataContext db = new HeraSupportDataContext();
            //
            // Métodos de pesquisa
            public IQueryable<Area> SelecionarTodas()
            {
                return db.Areas;
            }
    
            public IQueryable<Area> BuscarAreas(int id)
            {
                return from area in db.Areas
                       where area.cod_area == id
                       orderby area.descricao
                       select area;
            }
    
            public IQueryable<Area> SelecionarAreasDeEmpresa(int empresa)
            {
                return from area in db.Areas
                       where area.cod_empresa == empresa
                       orderby area.descricao
                       select area;            
            }
            
            public Area SelecionarArea(int cod)
            {
                return db.Areas.SingleOrDefault(d => d.cod_area == cod);
            }
            //
            // Métodos de inserção e deleção
            public void Adicionar(Area area)
            {
                db.Areas.InsertOnSubmit(area);
            }
            public void Excluir(Area area)
            {
                db.Usuarios.DeleteAllOnSubmit(area.Usuarios);
                db.Areas.DeleteOnSubmit(area);
            }
            //
            // Persistence
            public void Salvar()
            {
                db.SubmitChanges();
            }
        }
    }
    AGORA A CLASSE DE CONTROLE DO USUARIO:
    UsuarioController.cs (Só colocarei a classe viewmodel e as de adicionar e editar, onde preciso do cascading. O action que voce sugeriu está entre o get e post do Adicionar.)
    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Linq;
    using System.Security.Principal;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.Mvc;
    using System.Web.Mvc.Ajax;
    using HeraSupport.Models;
    using HeraSupport.Helpers;
    using HeraSupport.Controllers;
    using dotNetMembership = System.Web.Security.Membership;
    using dotNetRoles = System.Web.Security.Roles;
    
    namespace HeraSupport.Controllers
    {
        //
        // View Class Model
        public class UsuarioFormViewModel
        {
            // Properties
    
            public AreaRepositorio arearep = new AreaRepositorio();
            public EmpresaRepositorio empresarep = new EmpresaRepositorio();
    
            public Usuario usuarios { get; private set; }
            public Empresa Empresa = new Empresa();
            public Area Area = new Area();
    
            public SelectList cod_area { get; private set; }
            public SelectList cod_empresa { get; private set; }
    
            // Constructor
            public UsuarioFormViewModel(Usuario Usuarios)
            {
                usuarios = Usuarios;
    
                if (Usuarios.cod_area == 0 && Usuarios.cod_empresa == 0)
                {
                    cod_empresa = new SelectList(empresarep.SelecionarTodas(), "cod_empresa", "nome");
                    cod_area = new SelectList(arearep.SelecionarTodas(), "cod_area", "descricao");
                }
                else
                {               
                    cod_empresa = new SelectList(empresarep.SelecionarTodas(), "cod_empresa", "nome", usuarios.cod_empresa);
                    cod_area = new SelectList(arearep.SelecionarAreasDeEmpresa(usuarios.cod_empresa), "cod_area", "descricao", usuarios.cod_area);
                }           
                
                Empresa = empresarep.SelecionarEmpresa(usuarios.cod_empresa);
                Area = arearep.SelecionarArea(usuarios.cod_area); 
            }
        }
        //
        // Controller Class
        public class UsuarioController : Controller
        {
            UsuarioRepositorio UsuarioRepositorio = new UsuarioRepositorio();
            Usuario temporario = new Usuario();
           //
            // GET: /Usuario/Editar/2
            [Authorize]
            public ActionResult Editar(int id)
            {
                Usuario Usuario = UsuarioRepositorio.SelecionarUsuario(id);
                temporario = Usuario;
                if (User.Identity.Name == null)
                    return View("InvalidUser");
                return View(new UsuarioFormViewModel(Usuario));
            }
            //
            // POST: /Usuario/Editar/2
            [AcceptVerbs(HttpVerbs.Post), Authorize]
            public ActionResult Editar(int id, FormCollection collection)
            {
                Usuario Usuario = UsuarioRepositorio.SelecionarUsuario(id);
                if (User.Identity.Name == null)
                    return View("InvalidUser");
                try
                {
                    UpdateModel(Usuario);
    
                    // DEPOIS verificar como se atualiza infromacoes de login.
                    //AccountMembershipService login = new AccountMembershipService();
                    //login.UpdateUser(Usuario.login, temporario.senha, Usuario.senha, Usuario.email);
                    
                    UsuarioRepositorio.Salvar();
                    return RedirectToAction("Detalhe", new { id = Usuario.cod_usuario });
                }
                catch
                {
                    ModelState.AddModelErrors(Usuario.GetRuleViolations());
                    return View(new UsuarioFormViewModel(Usuario));
                }
            }
            //
            // GET: /Usuario/Adicionar
            [Authorize]
            public ActionResult Adicionar()
            {
                Usuario Usuario = new Usuario();
                if (User.Identity.Name == null)
                    return View("InvalidUser");
                return View(new UsuarioFormViewModel(Usuario));
            }
            
    public ActionResult ListaArea(int id) { return Json(AreaRepositorio.SelecionarAreasDeEmpresa(id)); }
    // // POST: /Usuario/Adicionar [AcceptVerbs(HttpVerbs.Post), Authorize] public ActionResult Adicionar(Usuario Usuario) { if (User.Identity.Name == null) return View("InvalidUser"); { try { UsuarioRepositorio.Adicionar(Usuario); AccountMembershipService login = new AccountMembershipService(); login.CreateUser(Usuario.login, Usuario.senha, Usuario.email); UsuarioRepositorio.Salvar(); return RedirectToAction("Detalhe", new { id = Usuario.cod_usuario }); } catch { ModelState.AddModelErrors(Usuario.GetRuleViolations()); return View(new UsuarioFormViewModel(Usuario)); } } } } }
    AGORA O ARQUIVO .ASCX DO USUARIO:
    UsuarioForm.ascx (Só colocarei a parte do javascript e apenas os campos do dropdownlist, os dois separados como eu fazia, e mais um com as alterações sugeridas por voce.)
    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<HeraSupport.Controllers.UsuarioFormViewModel>" %>
    
    <asp:Content ID="Javascript" ContentPlaceHolderID="HeadContent" runat="server"> 
    <script type="text/javascript">
        $(document).ready(function() {
            $("#cod_empresa").change(function() {
                listaArea($(this).val());
            });
        });
        //chamada ajax para a Action ListaCidade  
        //passando como parâmetro a Estado selecionado
        function listaArea(empresa) {
            $.getJSON('<%= Url.Action("ListaArea") %>/' + empresa, listaAreaCallBack);
        }
        //função que irá ser chamada quando terminar 
        //a chamada ajax 
        function listaAreaCallBack(json) {
            //Limpar os itens que são maiores que 0 
            //Ou seja: não retirar o primeiro item 
            $("#Areas :gt(0)").remove();
            $(json).each(function() {
                //adicionando as opções de acordo com o retorno 
                $("#Areas").append("<option value='" + this.Id + "'>" + this.Nome + "</option>");
            });
        }   
    </script> 
    </asp:Content>
    
    <%= Html.ValidationSummary("Por favor, corrija os erros e tente novamente.")%>
    
        <% using (Html.BeginForm()) {%>
    
            <fieldset>
                <p>
                    <label for="nome">Nome:</label>
                    <%= Html.TextBox("nome", Model.usuarios.nome)%>
                    <%= Html.ValidationMessage("nome", "*") %>
                </p>
                <p>
                    <label for="cod_empresa">Empresa em que trabalha: ANTIGO</label>
                    <%= Html.DropDownList("cod_empresa", "Empresa") %>
                    <%= Html.ValidationMessage("cod_empresa", "*") %>
                </p>
                <p>
                    <label for="cod_area">Área em que trabalha:</label>
                    <%= Html.DropDownList("cod_area", "Selecione uma area") %>                
                    <%= Html.ValidationMessage("cod_area", "*") %>
                </p>
                <p>
                    <label for="cod_empresa">Empresa em que trabalha: TESTE</label>
                    <% =Html.DropDownList("cod_empresa","Empresa") %> 
                    <select id="Areas"> 
                        <option selected="selected" value="">Areas</option> 
                    </select>
                    <%= Html.ValidationMessage("cod_empresa", "*") %>
                </p>                     
                <div>
                    <a href="/usuario"><img class="image" src="../../Content/img/voltar.ico" alt="Voltar aos Usuários"/></a>
                    <input class="image" type="image" src="../../Content/img/ok.ico" alt="Salvar"/>
                </div>
            </fieldset>
            
        <% } %>
    UFA!!!

    É isso, espero que dê para identificar o problema...
    Muito obrigado pelo seu tempo, ajuda e disposição.

    Grande abraço.



    terça-feira, 15 de setembro de 2009 11:56
  • Olá João,

    Tá meio difícil de encontar o erro, vc conseguiu popular o primeiro combo, como um bom padawan (heheheh) deve seguir uma coisa de cada vez, vamos fazer o seguinte...

    Tente popular o primeiro combo, pelo que percebi tem um erro nesta linha:

    <%= Html.DropDownList("cod_empresa", "Empresa") %>

    Desta forma o DropDownList irá procurar uma ViewData["cod_empresa"] e você não tem esta viewdata, você deve mudar para (ou alguma coisa parecida):

    <%= Html.DropDownList("cod_empresa",Model.cod_area as SelectList, "Empresa") %>

    O primeiro parâmetro é o nome do controle, o segundo é um objeto do tipo SelectList (os dados) e o terceiro é o Primeiro item que não vai ter valor.

    Agora, me parece que você tem outros problemas, na minha opinião você está "invadindo as fronteiras" do MVC, na sua classe controle existe uma classe UsuarioFormViewModel que na minha opinião deveria estar na pasta Models, isto não é o maior problema, nesta classe você está devolvendo umSelectList, na minha opinião quem pode devolver um selectList é um Controller e não uma classe "ViewModel". 

    De novo espero ter ajudado 

    Victor Cavalcante 
    http://www.cavalcante.net
    terça-feira, 15 de setembro de 2009 13:36
  • UHM... de sabedoria, palavras traz você...
    Vamos lá!

    Aqui:
    <%= Html.DropDownList("cod_empresa", "Empresa") %>

    Ele procura o cod_empresa, que está aqui, dentro do viewmodel:

    cod_empresa = new SelectList(empresarep.SelecionarTodas(), "cod_empresa", "nome");

    E o segundo item pega o objeto Empresa do tipo Empresa que criei também no viewmodel, ou seja, o dropdown vai criar uma lista selecionando todas as empresas e exibindo o nome delas usanco o código como índice. o segundo parametro retorna um texto quando o valor do dropdown é nulo, ou seja, quando não estiver nada selecionado no dropdownlist, ele vai exibir a string "Empresa". Eu já havia feito o comando da forma que voce sugeriu, e da certo, mas me orientaram que não era necessario, pois isto já era feito atraves do objeto cod_empresa que já é do tipo selectlist.

    Agora... sobre as "invasões" do mvc... estou quase vestindo uma camisa de força e me internando, porque cada artigo, cada livro, cada video, cada tutorial, implementam o mvc de forma diferente e cada um defende sua verdade absoluta...

    o viewmodel eu peguei como exemplo do tutorial NerdDinner do Schott Gut, e é como eu tenho usado... estou lendo o livro do Steven Sanderson "Pro ASP.NET MVC Framework" e ele já faz a implementação totalmente diferente. Como eu já comecei dessa forma, tenho que terminar este trabalho assim, ... meu patrão não quer que eu fique mudando de formas de implementação... num outro projeto, aí sim, agente testa outra, mas nesse, tenho que continuar assim.

    Ora, mas voce trouxe coisas interessantes para eu pensar, por exemplo, o viewmodel devolver o selectlist... se eucolocasse isso fora do corpo do viewmodel, mas dentro da mesma classe de controle, estaria mais adequado?
    eu teria que criar um metodo novo para isso, que seria chamado dentro do view model? ainda fico meio perdido nos limites entre cada camada...

    Mas voltando para o dropdownlist... o primeiro funciona perfeitamente... preciso selecionar algo e popular o segundo...



    terça-feira, 15 de setembro de 2009 13:56
  • Olá João,

    Como eu disse é uma questão de opinião...

    Eu prefiro a viewModel (quando eu preciso) na pasta de models. 
    Eu também prefiro utilizar o selectList em uma ViewData[""] especifica para passar ele, mas isso é preferência não é o certo ou errado. Tem casos que até coloco na viewModel para facilitar a geração de código da view. Mas cada caso é um caso.

    Você conseguiu resolver o seu problema?

    Abraços,

    Victor Cavalcante
    http://www.cavalcante.net
    terça-feira, 15 de setembro de 2009 14:35
  • Se o primeiro já está funcionando... tá mais fácil.

    Crie o código do HTML do segundo sem usar a função dropDownList:

    	   <p>
                    <label for="cod_empresa">Empresa em que trabalha: TESTE</label>
                    <select id="cod_empresa"> 
    <option selected="selected" value="">Areas</option> </select> <%= Html.ValidationMessage("cod_empresa", "*") %> </p>
    Agora crie uma nova action para listar as empresas (esta action não vai retornar uma view, ela ira retornar um jsonResult), deve ser alguma coisa parecida com o que está abaixo

    Public ActionResult ListaEmpresa(String Id){
    json(arearep.SelecionarAreasDeEmpresa(Id));
    }

    Agora vem o jQuery que você terá que consultar esta action.... agora pega o exemplo lá do blog que é bem parecido.






    terça-feira, 15 de setembro de 2009 14:49
  • Olá Vitor,

    Fiz as alterações e ajustes, mas agora dá esse erro:

    "Controles de conteúdo precisam ser controles de alto nível em uma página de conteúdo ou em uma página mestre aninhada que faz referência a uma página mestre."

    Apontando para o comando:

    <% Html.RenderPartial(

    "UsuarioForm"); %>


    Esta linha fica no Adicionar.aspx que utiliza um partial form UsuarioForm.ascx.

    Abraços.

    João Luiz
    terça-feira, 15 de setembro de 2009 18:01
  • Bem, esse problema acima eu resolvi colocando o script no Adicionar.aspx, e tirei do partial form.

    Agora o dropdownlist da area somente aparece uma opção (Area) e não aparece a lista de areas referentes a empresa selecionada
    terça-feira, 15 de setembro de 2009 18:36
  • Me parece que o erro agora é no javascript.

    Posta o HTML gerado pela aplicação para eu dar uma olhada.

    Abraços,

    Victor Cavalcante
    http://www.cavalcante.net
    @vcavalcante
    quarta-feira, 16 de setembro de 2009 17:52
  • Como eu vejo o html gerado???
    quarta-feira, 16 de setembro de 2009 19:33
  • No Browser vá clique com o botão direito na página e procure exibir código fonte.

    Abraços,

    Victor Cavalcante
    http://www.cavalcante.net
    @vcavalcante
    quarta-feira, 16 de setembro de 2009 19:36
  • O código HTML gerado é esse:


    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head><title>
    	
    	Adicionar um usuário
    
    </title><link href="../Content/Pagina.css" rel="stylesheet" type="text/css" />
        <script src="../../Scripts/jquery-1.3.2.js" type="text/javascript"></script> 
         
    <script type="text/javascript">
        $(document).ready(function() {
            $("#cod_empresa").change(function() {
                listaArea($(this).val());
            });
        });
        //chamada ajax para a Action ListaCidade  
        //passando como parâmetro a Estado selecionado
        function ListaEmpresa(empresa) {
            $.getJSON('/Usuario/ListaEmpresa/' + empresa, listaAreaCallBack);
        }
        //função que irá ser chamada quando terminar 
        //a chamada ajax 
        function listaAreaCallBack(json) {
            //Limpar os itens que são maiores que 0 
            //Ou seja: não retirar o primeiro item 
            $("#cod_area :gt(0)").remove();
            $(json).each(function() {
                //adicionando as opções de acordo com o retorno 
                $("#cod_area").append("<option value='" + this.Id + "'>" + this.Nome + "</option>");
            });
        }   
    </script> 
    </head>
    
    <body>
        <div class="page">
    
                <div id="header">
                    <div id="title">
                        <h1>HeraSupport</h1>
                    </div>
                      
                    <div id="logindisplay">
                        <br />
                        <br />
                        <br />
                        
            Welcome <b>joaoluizbt</b>!
            [ <a href="/Account/LogOff">Log Off</a> ]
    </div> 
                    
                    <div id="menucontainer">
                    
                        <ul id="menu">              
                            <li><a href="/">In&#237;cio</a></li>
                            <li><a href="/Licenciada">Empresas Licenciadas</a></li>
                            <li><a href="/TipoContrato">Tipos de Contrato</a></li>
                            <li><a href="/Empresa">Empresas</a></li>
                            <li><a href="/Area">&#193;reas</a></li>
                            <li><a href="/Usuario">Usu&#225;rios</a></li>
                            <li><a href="/SolicitacaoAtendimento">Solicita&#231;&#245;es de Atendimento</a></li>
                            <li><a href="/OrdemServico">Ordens de Servi&#231;o</a></li>
                            <li><a href="/Home/About">Sobre</a></li>
                        </ul>
                    
                    </div>
                </div>
                <div id="main">
                    <div class="moldura">
                        
    
        <h1>Adicionar um Usuário</h1>
    
            
    
        <form action="/Usuario/Adicionar" method="post">
    
            <fieldset>
                <p>
                    <label for="nome">Nome:</label>
                    <input id="nome" name="nome" type="text" value="" />
                    
                </p>
                <p>
                    <label for="login">Login:</label>
                    <input id="login" name="login" type="text" value="" />
                    
                </p>
                <p>
                    <label for="senha">Senha:</label>
                    <input id="senha" name="senha" type="text" value="" />
                    
                </p>
                <p>
                    <label for="endereco">Endereço:</label>
                    <input id="endereco" name="endereco" type="text" value="" />
                    
                </p>
                <p>
                    <label for="telefone">Telefone:</label>
                    <input id="telefone" name="telefone" type="text" value="" />
                    
                </p>
                <p>
                    <label for="email">E-Mail:</label>
                    <input id="email" name="email" type="text" value="" />
                    
                </p>
                <p>
                    <label for="nivel">Nível:</label>
                    <input id="nivel" name="nivel" type="text" value="" />
                    
                </p>
                <p>
                    <label for="cod_empresa">Empresa em que trabalha:</label>
                    <select id="cod_empresa" name="cod_empresa"><option value="">Empresa</option>
    <option value="1">Hera Informatica</option>
    <option value="2">Jo&#227;o Software</option>
    </select>
                    
                </p>
                <p>
                    <label for="cod_area">Área em que trabalha: TESTE</label>                
                    <select id="cod_empresa">                     
                        <option selected="selected" value="">Areas</option> 
                    </select>
                    
                </p> 
                <p>
                    <label for="cod_area">Área em que trabalha:</label>
                    <select id="cod_area" name="cod_area"><option value="">Selecione uma area</option>
    <option value="52">Desenvolvimento.</option>
    <option value="53">Recursos Humanos.</option>
    <option value="54">TI.</option>
    </select>                
                    
                </p>
                <p>
                    <label for="ativo_inativo">Status: (ativo/inativo)</label>
                    <input id="ativo_inativo" name="ativo_inativo" type="text" value="" />
                                   
                </p>            
                <div>
                    <a href="/usuario"><img class="image" src="../../Content/img/voltar.ico" alt="Voltar aos Usuários"/></a>
                    <input class="image" type="image" src="../../Content/img/ok.ico" alt="Salvar"/>
                </div>
            </fieldset>
            
        </form>
                        <div id="footer">
                        </div>
                    </div>
                </div>
        </div>
    </body>
    </html>
    
    segunda-feira, 21 de setembro de 2009 14:37
  • Vou fechar o tópico, pois meu projeto com mvc está parado.

    Quando eu precisar novamente, eu crio outro post e falo com voces.

    Obrigado pelas orientações.
    • Marcado como Resposta joaoluizbt quinta-feira, 1 de outubro de 2009 13:44
    quinta-feira, 1 de outubro de 2009 13:44