Vamos continuar a criar a nossa tela de cadastro para a entidade Tipo Telefone, no post anterior criamos uma Grid para mostrar os dados, hoje vamos estar terminando a tela para Editar e Criar um novo registro.
Cadastrar
Abra o arquivo Create.ascx e vamos criar o formulário, veja abaixo o código:
Ext.onReady(function() {
var painel = new Ext.form.FormPanel({
id: 'painel',
name: 'painel',
renderTo: 'create',
items: [{
xtype: 'textfield',
allowBlank: false,
name: 'txtDescricao',
id: 'txtDescricao',
fieldLabel: 'Descrição'
}],
buttonAlign: 'center',
buttons: [{
//btnSalvar
name: 'btnSalvar',
id: 'btnSalvar',
text: 'Salvar',
iconCls: 'icon-save'
}, {
//btnFechar
name: 'btnFechar',
id: 'btnFechar',
text: 'Fechar',
iconCls: 'icon-cancel'
}]
});
});
Veja o resultado da nossa tela:
Agora vamos adicionar os eventos para os boões Salvar e Fechar, em cada botão temos um evento chamado Handler que é executado quando o usuário clica no botão, veja o código abaixo:
Ext.onReady(function() {
var painel = new Ext.form.FormPanel({
id: 'painel',
name: 'painel',
renderTo: 'create',
items: [{
xtype: 'textfield',
allowBlank: false,
name: 'txtDescricao',
id: 'txtDescricao',
fieldLabel: 'Descrição'
}],
buttonAlign: 'center',
buttons: [{
//btnSalvar
name: 'btnSalvar',
id: 'btnSalvar',
text: 'Salvar',
iconCls: 'icon-save',
handler: function() {
// recuperamos o que o usuário digitou
var desc = Ext.getCmp('txtDescricao').getValue();
// verificamos se a variavel global _cod
// se for igual a null é um novo registro
// senao é um registro para alterar
if (_cod == null || _cod == undefined) {
// chamamos a funcao para cadastrar
CadastrarRegistro(desc);
} else {
// chamamos a funcao para alterar
AlterarRegistro(_cod, desc);
}
}
}, {
//btnFechar
name: 'btnFechar',
id: 'btnFechar',
text: 'Fechar',
iconCls: 'icon-cancel',
handler: function() {
// fechamos o formulario
Ext.getCmp('formNovoRegistro').close();
}
}]
});
});
Agora vamos criar a função CadastrarRegistro, veja abaixo:
function CadastrarRegistro(paramDesc)
{
Ext.Ajax.request(
{
url: '/TipoTelefone/Cadastrar',
params:
{
descricao: paramDesc
},
success: function() {
// atualizamos nosso store
Ext.getCmp('gridTipoTelefone').getStore().load();
//exibir uma mensagem para o usuario
Ext.Msg.show({
title: 'Sucesso',
msg: 'Dados cadastrados com sucesso',
buttons: Ext.Msg.OK,
icon: 'msg-success'
});
// fechamos o formulario
Ext.getCmp('formNovoRegistro').close();
}
});
}
Nessa função vai ser responsável por cadastrar os novos registros, vamos chamar uma action do nosso controller chamado Cadastrar que vai chamar nosso repositório para persistir os dados no banco, abra o arquivo TipoTelefoneController.cs e adicione mais uma action chamada Cadastrar, veja abaixo:
public JsonResult Cadastrar(string descricao)
{
try
{
TipoTelefone tipoTelefone = new TipoTelefone();
tipoTelefone.Descricao = descricao;
_tipoTelefoneRepository.Salvar(tipoTelefone);
return Json(new { success = true });
}
catch (Exception e)
{
return Json(new { success = false, e.Message, e.StackTrace });
}
}
Veja o resultado:
Veja que quando você cadastra um registro, automaticamente a grid ja é atualizada
Alterar
Para fazer a ação de alterar vamos adicionar um botão para cada registro na Grid, vamos estar usando um plugin chamado RowActions.js que pode ser baixado aqui, veja abaixo como criar esse botão.
var botaoGridEditar = new Ext.ux.grid.RowActions({
dataIndex: '',
header: '',
align: 'center',
actions: [{
iconCls: 'icon-edit',
tooltip: 'Editar Registro'
}]
});
var botaoGridExcluir = new Ext.ux.grid.RowActions({
dataIndex: '',
header: '',
align: 'center',
actions: [{
iconCls: 'icon-del',
tooltip: 'Excluir Registro'
}]
});
Depois de criado os botões, temos que adiciona-los na Grid, no componente GridPanel temos uma propriedade chamada plugins aonde devemos adicionar nossos botões criados, após temos que adicionar como colunas, veja o código da Grid abaixo:
var gridTipoTelefone = new Ext.grid.GridPanel({
id: 'gridTipoTelefone',
name:'gridTipoTelefone',
store: tipoTelefoneStore,
title: 'Tipo Telefone',
width: 500,
height: 300,
renderTo: 'div_grid',
loadMask: true,
border: true,
stripeRows: true,
plugins: [botaoGridEditar, botaoGridExcluir],
columns: [
botaoGridEditar,
botaoGridExcluir,
{
dataIndex: 'Codigo',
header: 'Código',
width: 60
}, {
dataIndex: 'Descricao',
header: 'Descrição',
width: 380
}],
tbar: [{
text: 'Novo',
iconCls: 'icon-new',
handler: novoRegistro /* aqui adicionamos o envento ao botão*/
}, '-']
});
Execute o projeto e veja o resultado:
Depois de criado os botões temos que adicionar os eventos para cada um deles, vamos adicionar uma propriedade Callback que será executado quando o cliente clicar no botão, veja abaixo como vai ficar cada botão.
var botaoGridEditar = new Ext.ux.grid.RowActions({
dataIndex: '',
header: '',
align: 'center',
actions: [{
iconCls: 'icon-edit',
tooltip: 'Editar Registro'
}],
callbacks: {
'icon-edit': function(grid, record, action, row, col) {
// recuperamos os dados da linha selecionada
_cod = gridTipoTelefone.getStore().getAt(row).get('Codigo');
_desc = gridTipoTelefone.getStore().getAt(row).get('Descricao');
// mostramos o formulário
MostrarFormulario();
}
}
});
var botaoGridExcluir = new Ext.ux.grid.RowActions({
dataIndex: '',
header: '',
align: 'center',
actions: [{
iconCls: 'icon-del',
tooltip: 'Excluir Registro'
}],
callbacks: {
'icon-del': function(grid, record, action, row, col) {
_cod = gridTipoTelefone.getStore().getAt(row).get('Codigo');
Ext.MessageBox.show({
title: 'Mensagem',
msg: 'Tem certeza que deseja deletar esse registro?',
buttons: Ext.MessageBox.OKCANCEL,
icon: Ext.MessageBox.QUESTION,
fn: function(btn) {
if (btn == 'ok')
DeletarRegistro(_cod);
}
});
}
}
});
Veja que no callback do botão editar estamos chamando a função MostrarFormulario que vai abrir a popup com os dados preenchidos. Vamos abrir o arquivo Create.ascx e alterar para mostar os dados para editar.
Ext.getCmp('txtDescricao').setValue(_desc);
Agora vamos criar a função AlterarRegistro, veja abaixo o código:
function AlterarRegistro(paramId,paramDesc)
{
Ext.Ajax.request(
{
url: '/TipoTelefone/Alterar',
params:
{
id: paramId,
descricao: paramDesc
},
success: function() {
Ext.getCmp('gridTipoTelefone').getStore().load();
Ext.Msg.show({
title: 'Sucesso',
msg: 'Dados alterados com sucesso',
buttons: Ext.Msg.OK,
icon: 'msg-success'
});
Ext.getCmp('formNovoRegistro').close();
}
});
}
Veja que estamos chamando uma action Alterar, abra o controller TipoTelefoneController e adicione uma nova action chamada Alterar, veja abaixo.
public JsonResult Alterar(string id, string descricao)
{
try
{
TipoTelefone tipoTelefone = _tipoTelefoneRepository.ObterPorId(Convert.ToInt32(id));
tipoTelefone.Descricao = descricao;
_tipoTelefoneRepository.Alterar(tipoTelefone);
return Json(new { success = true });
}
catch (Exception e)
{
return Json(new { success = false, e.Message, e.StackTrace });
}
}
Execute o projeto e veja o resultado.
Veja que a grid se atualizou automaticamente.
Excluir
Veja que no callback do botão excluir chamamos outra função para deletar o registro, veja abaixo:
function DeletarRegistro(id) {
Ext.Ajax.request(
{
url: '/TipoTelefone/Deletar',
params:
{
id: id
},
success: function(result) {
//recupera o result
jsonData = Ext.util.JSON.decode(result.responseText);
if (jsonData.success) {
Ext.getCmp('gridTipoTelefone').getStore().load();
Ext.Msg.show({
title: 'Sucesso',
msg: 'Dados excluídos com sucesso',
buttons: Ext.Msg.OK,
icon: 'msg-success'
});
}
else {
Ext.Msg.show({
title: 'Erro',
msg: jsonData.message,
buttons: Ext.Msg.OK,
icon: 'msg-error'
});
}
},
failure: function() {
Ext.Msg.alert('Falha na conexão', 'Houve uma falha ao conectar com o servidor');
}
});
}
Agora vamo criar a action no nosso controller TipoTelefoneController, veja abaixo:
public JsonResult Deletar(string id)
{
try
{
TipoTelefone tipoTelefone = _tipoTelefoneRepository.ObterPorId(Convert.ToInt32(id));
_tipoTelefoneRepository.Excluir(tipoTelefone);
return Json(new { success = true });
}
catch (Exception e)
{
return Json(new { success = false, message = e.Message, stack = e.StackTrace });
}
}
Vamos executar nosso projeto e ver o resultado:
Se o cliente confirmar a exclusão, chamamos nossa action para deletar, veja que quando deletamos o registro já atualizamos a grid.
Chegamos ao final da série de posts para estar criando uma arquitetura usando EXT JS com ASP NET MVC e persistindo os objetos com NHibernate.
Se você quiser proseguir com o exemplo criando as outras telas, poderá seguir esse exemplo que não terá maiores problemas.
Qualquer dúvida deixe seu comentário abaixo!
Espero que esse pequeno tutorial divido em 7 partes tenha ajudado a entender como trabalhar com esses frameworks integrado como .NET
Até a próxima!








Leandro,
O exemplo roda no servidor interno do VS 2008 mas não roda no iis(localhost). Provavelmente por não encontrar as libs do extjs. Tem algum detalhe que precise ser configurado ao pubica a aplicação?
Muito bom o artigo. Parabéns!
grato,
Nilson
Nilson,
Veja no seu deploy se a pasta do extjs esta no IIS, também veja o caminho para os arquivos JS
att,
Leandro Prado
Parabéns pelo post, muito claro e extremamente didático.
Great Job!
Meus parabéns pelo excelente tutorial.
Altamente didático. Perfeito!
Gostei muito da arquitetura sugerida. Poucos pensam desta forma.
Só estou precisando de um help. Já fiz de tudo.
Coloquei sua implementação para rodar usando o VS2010.
Não sei porquê, mas os dados da tabela TipoTelefone são obtidos pelo método
public JsonResult GetAll()
{
IList lst = _tipoTelefoneRepository.ObterTodos();
return Json(new { tipotelefone = lst, totalProperty = lst.Count });
}
porém, os valores não são apresentados no grid.
Você tem idéia do que pode estar acontecendo?
Mais uma vez parabéns pelo tutorial.
Leandro,
Parabéns pelo tutorial. Excelente didática.
Apenas preciso de um help.
Baixei o seu exemplo completo. Coloquei ele pra rodar no VS2010.
Está ocorrendo que os dados não são mostrados no grid.
Já debuguei, e constatei que os dados estão na lista que é passada a Json.
O que pode estar havendo?
Julio
Ocorre algum erro de JavaScript??
Rode no Mozilla e use o Firebug para ver se ocorre algum erro…
Também execute no Mozilla o método TipoTelefone/GetAll e veja se retorna o json
qualquer coisa da um grito ai!
Leandro Prado
Resolvido!
Parece que este erro está relacionado ao MVC2.
Foi o que entendi conforme http://forums.asp.net/t/1483387.aspx .
Então solucionei usando o parâmetro em destaque.
public JsonResult GetAll()
{
IList lst = _tipoTelefoneRepository.ObterTodos();
return Json(new { tipotelefone = lst, totalProperty = lst.Count }, JsonRequestBehavior.AllowGet);
}
Obrigado pela ajuda.
Mais uma vez parabéns pelo tutorial.
Abraço.
Salve galera.
Parabens, Leandro Otimo tutorial.
Alguem consegui uma solução de nao mostrar a lista a solução do Julio nao deu certo no VS2010
Vou baixar o projeto e vou tentar rodar no VS2010…
Douglas
Baixei o projeto e rodei no VS2010 com a alteração que o Julio recomendou e deu tudo certo..
esta retornando algum erro??
att,
Leandro Prado
Oi Leandro
O erro é em relação ao retorno do metodo obtertodos que é lista de tipos de telefone, com esta solução teria que ser mudado em outras camadas da aplicação, retornando a lista sem um tipo definido. Seria isto?
Douglas,
O problema não esta na List podemos trabalhar com listas tipadas sem nenhum problema… aqui funcionou colocando uma diretiva no retorno do Jason, como o Julio tinha comentado…
Está retornando algum erro??
att,
Leandro Prado
Leandro
O sistema nao compila e da a seguinte menssagem de erro. eu copiei o metodo GetAll na integra.
Error 1 Cannot implicitly convert type ‘System.Collections.Generic.IList’ to ‘System.Collections.IList’. An explicit conversion exists (are you missing a cast?) C:\ContatosParte7\Contatos\Contatos.Web\Controllers\TipoTelefoneController.cs 32 25 Contatos.Web
Douglas,
Veja que System.Collections.Generic.IList é diferente de System.Collections.IList você tem que criar uma lista do tipo genérica para receber os dados
System.Collections.Generic.IList lst = _tipoTelefoneRepository.ObterTodos();Qualquer coisa, baixe o projeto novamente e tente rodar, ou compare com seu código…
att,
Leandro Prado
Leandro,
Agora funcionou. portanto alem dos parabens pelo tutrial quero tambem lhe agradecer pela sua muita atenção.
Opa…. 1000 maravilhas….
qualquer coisa da um grito aí!!!
att,
Leandro Prado
A proposito o arquivo rowaction se encaixa onde?
Douglas,
o RowAction é para adicionar os botões em cada lina da grid, dessa forma colocando uma ação…
att,
Leandro Prado
Leandro,
Seria dificil colocar o spring nesta aplicação? voce conhece alguma fonte de informação neste sentido?
Leandro,
Gostei bastante da arquitetura sugerida e parabéns pela iniciativa dos tutoriais.
Uma pergunta. Poderia utilizar essa arquitetura para uma aplicação comercial grande ? Ou não seria aconselhável ? Estou começando no .NET agora e verificando qual modelo seria melhor para iniciar a aplicação.
Abraço.
Alexandre,
Essa arquitetura pode ser usada em um sistema grande.. sem problemas.. já usei e deu um resultado muito bom….
a única alteração seria trocar a forma de conexão com o NHibernate como descrevi nesse post -> Usando NHibernate Com ASP NET MVC tirando isso é uma boa arquitetura…
att,
Leandro Prado
Olá Leandro, talvez o que eu vá perguntar não seja o foco do tutorial, mas não sei mais onde encontrar resposta…
Eu preciso mapear um campo do Mysql que é do tipo TIME. Por acaso não sabe como fazer isso…?
Abracao e parabens pelo Tutorial. Muito bom.
veja se resolve…
http://www.nhforge.org/doc/nh/en/index.html#mapping-types
http://nhforge.org/blogs/nhibernate/archive/2009/03/11/nhibernate-and-ms-sql-server-2008-date-time-datetime2-and-datetimeoffset.aspx
att,
Leandro Prado
Leandro, obrigado pela ajuda.
Ja havia olhado estes dois links que passou e tentado de todas as formas possíveis e não tinha conseguido.
O problema todo imagino que possa estar no formato que o C# atribui quando usamos os metodos das classes DateTime e TimeSpan, que as vezes inclui milisegundos tb ou o valor ref. a Data zerado.
Talvez haja formas de truncar isto, porém quando mapiei como String mesmo e passei para a classe de persistencia no formato correto, deu certo. Embora não seja a solução mais elegante esta funcionando. Como DateTime, TimeSpan etc nao vai nem a pau…
Obrigado
Abracao!
Classes com propriedades many-to-one não mostra no grid , vc sabe pq ?
Ex.:
Márcio,
Veja qual o JSon esta retornando para a Grid… uma coisa é o many-to-one no NHibernate outra coisa bem diferente é a grid no EXT JS
att,
Leandro Prado
Ola Leandro, parabens pelo tutorial, q tem esclarecido muitas duvidas. Mas estou com problema no grid do EXTJS ele ate carrega as informações, mas esta desconfigurado aperencendo divs envolta do botao e esta maior. Sabe oq pode ta acontecendo ?…Obrigado.
Thiago,
Veja seus CSS, também ja tive problemas com DIVs do meu sistema com os DIVs do Ext
Um bom teste é, comente todos os seus css, deixe somente os css do EXT e veja se o problema resolve!
att,
Leandro Prado
Ola Leandro, vlw por responder. Entao eu não tenho css, alem do padrao do mvc que esta no Content/Site.css e seguindo sua dica comentei ele e o grid funcionou sem erros. Tambem fiz testes com o EXTJS 4 e com ele funcionou no mozilla e no chrome, ja IE8 da zica.
Vou ver com calma CSS do mvc e ver o pode ta dando conflito.
Mais valeu, agora ja sei aonde ta a inhaca…rsrsrs…Obrigado e sucesso para vc!!!
Thiago,
era o CSS mesmo.. ja tinha passado por algo parecido..
no IE8 q tipo de erro deu?? estranho teoricamente o ExtJs é para funcionar no IE8e IE9
att,
Leandro Prado
Intaum o mesmos problemas que estava tendo com o EXT 3. Mas descobri que no CSS do mvc havia uma configuração para table que comentei..(Oq não entendi pra que servia..rs).
…tanto o EXT 3 quanto o 4 funcionaram em todos os browsers que testei.
Dai foi só alegria
Abraços !!!
Ola Leandro,
Eu de novo enchendo o saco…rsrs. Não sei se foge mto do foco desse artigo. Mas tentei incrementar um pouco seu exemplo ultilizando DATETIME que é convertido em milesegundos pelo JSON. Estou varrendo a net atras de soluções para converter e exibir a data no grid EXTJS e não estou conseguindo. O maximo que consegui foi NAN/NAN/NAN seguindo a documentação do EXTJS. Caso posso me ajudar ficarei mto grato…Abraços.
Thiago
Como esta essa data no Json que vc retorna para o ExtJs?
att,
Leandro Prado
Thiago,
Problema resolvido
http://www.leandroprado.com.br/2011/05/formatar-data-na-ext-grid-gridpanel-usando-asp-net-mvc/
att,
Leandro Prado
Excelente trabalho, muito obrigado.
Já considerou migra o projeto para o MVC3?
Abraço
Luis
Sim, ja pensei.. mas o tempo esta curtissimo…
mas mudaria poucas coisas ja q a view é montada com o ExtJs e não com o Razor
att,
Leandro Prado
Bom dia, Leandro!
Já utilizo .Net (C#) com Ext.Net. Comecei há alguns dias, com base em seus tutoriais, a estudar o MVC3 com o ExtJs4. Para realização do CRUD, existe alguma outra forma de enviar os dados do FORM com uma única assinatura no método do controller ou sempre terá que se especificar todos os campos na assinatura ? Quando o formulário possui poucos campos é tranquilo, porém, existem alguns formulários que são um mais complexos.
Aproveito também para parabenizá-lo pelo trabalho realizado.
Att.
Maia
Flávio
Obrigado pelo comentário..
Quando estou utilizando um formulário com muitos parâmetros eu uso JSON da seguinte maneira
1) pego todos os campos e mando serializar para JSON
2) dou um POST nesse JSON para meu controller,
3) no controller recupero o JSON e deserializo para uma classe c#
Dessa maneira facilita bastante!!
att,
Leandro Prado
Olá Leandro!
Para pegar todos os campos do form, você utilizou o Ext.Ajax.serializeForm? Estou testando com ele mas não tive êxito. Ele me retorna somente o primeiro campo. Na assinatura no controller eu coloquei:
public JsonResult Salvar(string _camposFormulario)
Obrigado pela atenção.
Maia.
Flávio
Da uma olhada nesse post http://www.leandroprado.com.br/2011/04/criando-um-formulario-com-extjs-e-asp-net-mvc-3/ não é exatamente o que você quer porque ainda no Controller temos que declarar todos os campos do formulário
Vou dar uma pesquisada sobre serealizar o form para Json, se achar alguma coisa eu te aviso
att,
Leandro Prado
Olá Leandro!
No seu comentário anterior, você mecionou que serealiza os campos e depois deserealiza. De que forma você faz isso? Quanto ao link que você menciona, já venho utilizando o formato nos meus testes, mas o que pega realmente é a assinatura do controller.. Enfim, vou continuar pesquisando também e se achar algo posto aqui.
Novamente, muito obrigado.
Att.
Maia.
Flávio
Da uma olhada nesse post – http://www.leandroprado.com.br/2010/11/formulario-master-detail-com-asp-net-mvc-e-jquery/ aqui eu mostro como serealziar um objeto para JSON
Fiz esse teste ontem com o EXT e deu certo usando uma biblioteca de serialização do JQUERY
Qualquer dúvida da um grito ai!
att,
Leandro Prado
Leandro!
Mantive o form.submit e na assinatura do método, no controller, coloquei o FormCollection. A principio funcionou, mas vou testar com outros controles.
Veja como ficou:
Form:
var btnLogin = function () {
var form = Ext.getCmp(‘formPanelLogin’).getForm();
if (formPanelLogin.getForm().isValid()) {
formPanelLogin.getForm().submit({
waitMsg: ‘Validando Credenciais…’,
url: ‘@Url.Content(“~/Usuario/ValidarLogin”)’,
params: {},
success: function (form, action) {
if (action.result.success) {
Ext.Msg.alert(‘Aviso’, ‘Logar.’);
// document.location.href = ‘FrmMenu.cshtml’;
}
},
failure: function (form, action) {
Ext.Msg.alert(‘Erro’, action.result.message);
}
})
}
};
Controller:
public JsonResult ValidarLogin(FormCollection values)
{
UsuarioModel _usuarioModel = new UsuarioModel();
string usuario = values["UsrLogin"];
string senha = values["UsrSenha"];
if (usuario.Equals(“maia”))
return Json(new { success = true }, JsonRequestBehavior.AllowGet);
else
return Json(new { success = false, message = “Login Inválido” }, JsonRequestBehavior.AllowGet);
}
Agora se é o melhor modelo, ainda não sei..Mas vou testar com uns form´s que contemplem outros controles.. Auando tiver novidades posto aqui..
Novamente, muito obrigado pela atenção.
Forte abraço.
Maia.
entendi…
acho q é uma boa alternativa…
Leandro!
Você tem algum exemplo com Login utilizando o ExtJs4? Implementei isso no MVC3 mas não estou tendo sucesso para redirecionar para o menu principal após o login ser validado. Utilizei o window.location, mas dá erro 404.
var btnLogin = function () {
var form = Ext.getCmp(‘formPanelLogin’).getForm();
if (formPanelLogin.getForm().isValid()) {
formPanelLogin.getForm().submit({
waitTitle: ‘Aguarde!’,
waitMsg: ‘Validando Credenciais…’,
url: ‘@Url.Content(“~/Usuario/ValidarLogin”)’,
params: {},
success: function (form, action) {
if (action.result.success) {
window.location = ‘@Url.Content(“~/Views/Shared/FrmMenu.cshtml”)’;
}
},
failure: function (form, action) {
Ext.Msg.alert(‘Erro’, action.result.message);
}
})
}
};
Maia.
Flavio
1 ) Seu window.location deve redirecionar para uma action do seu controller
2) As view que estão na pasta Shared não correspondem as actions
3) o redirect deve acontecer para controler/action, ali vc está tentando redirecionar direto para uma view, crie uma action Index que retorna uma view que vai funcionar
att,
Leandro Prado
Entendi.. Nossos CRUD’s são partir de um Grid, igual ao seu post. Sendo assim, por exemplo, um CRUD para funcionários, teria um controller FuncionarioController.cs e após uma pasta, dentro da pasta Views, chamada Funcionário e dentro dela o Index.cshtm? Fico imaginando um projeto grande, como ficaria…
Novamente, obrigado mestre.
Maia.
Isso mesmo Flavio..
Não se preocupe, a quantidade de arquivos não está diretamente ligado a performance de seu projeto, essa hierarquia é para organizar seu projeto! Esse é o conceito do MVC
att,
Leandro Prado
Olá Leandro!
Estou trabalhando no form referente ao Menu. Este é configurado conforme o perfil do usuário. Porém, não estou conseguindo iterar a string JSON que é retornado com os itens do menu.
Controller:
public JsonResult ConfiguraMenuUsuario(string id)
{
string menuPerfil = “[{titulo: 'HelpDesk', icone': 'silk-add'},{titulo: 'Chamado', icone': 'silk-add'} ]“;
return Json(new { itensMenuPerfil = menuPerfil }, JsonRequestBehavior.AllowGet);
}
Client:
Ext.Ajax.request({
url: ‘@Url.Content(“~/Menu/ConfiguraMenuUsuario”)’,
//Paramentros que passaremos por POST
params: {
id: ’1′
},
contentType: “application/json; charset=utf-8″,
dataType: “json”,
type: “POST”,
success: function (r) {
var menu;
menu = Ext.decode(r.responseText);
var itensMenu = menu.itensMenuPerfil;
alert(itensMenu); —–>> Mostra string no formato Json, conforme enviado pelo controller.
Ext.each(itensMenu, function (itemMenu) {
alert(itemMenu.titulo); Mostra erro undefined
}, this);
}
})
Qualquer dica é bem vinda.
Obrigado.
Maia.
Leandro!
Resolvido. Mudei o tipo de retorno no controller de JsonResult para string
e funcionou.
Controller
public string ConfiguraMenuUsuario(string id)
{
string menuPerfil = “[{titulo: 'HelpDesk', icone': 'silk-add'},{titulo: 'Chamado', icone': 'silk-add'} ]“;
return menuPerfil;
}
Client:
Ext.Ajax.request({
url: ‘@Url.Content(“~/Menu/ConfiguraMenuUsuario”)’,
//Paramentros que passaremos por POST
params: {
id: ’1′
},
contentType: “application/json; charset=utf-8″,
dataType: “json”,
type: “POST”,
success: function (r) {
var menu;
menu = Ext.decode(r.responseText);
Ext.each(menu, function (itemMenu) {
alert(itemMenu.titulo);
}, this);
}
})
Até..
Maia.
Boa Noite Flavio
Estranho esse método retornando string dar certo… teoricamente retornando JSON seria o correto…
EU nunca usei o Menu do ExtJs, vou fazer alguns testes e depois conto para vc o resultado!
att,
Leandro Prado
Boa tarde, Leandro!
Realmente é estranho, mas está funcionando dessa forma. Após o retorno do CONTROLLER, ao dar um alert(itensMenu) é mostrado o formato Json: “[{titulo: 'HelpDesk',icone: 'silk-add',itens:[{titulo: 'Status',classref: 'GrdStatus.aspx'}]}]”. Alterei, no controller, para retornar string e ao dar o alert(itensMenu) é mostrado ‘object.Object’. Então altero para alert(itensMenu.titulo) e é apresentado o titulo do Menu, conforme cadastrado no BD.,
Já consegui montar o menu onde utilizei o Viewport. Porém, após mostrar o Viewport com menu ele retorna para o FormLogin e monstra novamente a tela de login. Conforme sua dica, eu criei um MenuController e também um Index para poder, após validar o login, redirecionar para o Menu.
FormLogin:
if (action.result.success) {
winFormLogin.el.unmask();
winFormLogin.hide();
window.location = ‘@Url.Content(“~/Menu/Index”)’;
}
MenuController:
public ActionResult Index()
{
return View();
}
View (Menu Index)
Ext.onReady(function () {
Ext.Msg.alert(‘ Estou no menu….’, ”);
});
Após apresentar mensagem acima, ele retorna para a tela do Login.
Obrigado.
Maia.
Flávio
Da uma olhada nesse tutorial
http://www.extdesenv.com.br/tutoriais-estudos/menu-dinamico-em-sete-passos
att,
Leandro Prado
Leandro!
Segui o mesmo raciocíonio do post que você postou. Já tenho
tudo pronto. O que pegou foi após montar o Viewport menu ele retornar para a tela de login.
Mesmo assim obrigado pelo retorno.
Maia.
Leandro!
Já consegui criar o menu de forma dinâmica. Quanto clico no item Menu ele até cria um novo TabPanel, porém não traz nada.
O handler do item menu ficou dessa forma:
var handlerMenu = function () {
var tab = tabPanel1.add({
id: 'Maia',
title: 'Consulta Usuários',
closable: true,
autoLoad: {
showMask: true,
url: '@Url.Content("~/Cliente/Index")',
mode: 'iframe',
noCache: true,
color: '#E1E1E1',
maskMsg: 'Carregando ...'
}
});
tabPanel1.setActiveTab(tab);
}
O action Index ficou assim:
Ext.onReady(function () {
Ext.Msg.alert('Agora é montar o Grid Cliente ...', '');
});
Porém, quando clico no item Menu Cliente, no Firebug ele traz:
Ext.onReady(function () {
Ext.Msg.alert('Agora é montar o Grid Cliente...', '');
});
O _ViewStart.cshtml está assim:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
O _layout.cshtml:
@RenderBody()
Enfim, se puder dar alguma dica…
Grato.
Maia.
Só retificando, no firebug ele traz:
Ext.onReady(function () {
Ext.Msg.alert(‘Que bom, Agora é criar a lista de usuários …’, ”);
});
Grato.
Maia.
Flavio
Vc ja viu esse post
http://www.extdesenv.com.br/extjs/examples/crudUsuarios/index.html acho que é exatamente o q vc precisa, só q esta em PHP, mas é tranquilo passar para .NET MVC
Aqui está mais explicado http://www.extdesenv.com.br/tutoriais-estudos/como-abrir-paginas-de-um-menu-no-centro-de-sua-aplicacao/
att,
Leandro Prado
Olá Leandro,
Estou criando uma arquitetura utilizando Asp.net MVC com ExtJS 4 e DDD, então, me deparei com uma dúvida. Percebi que o código em ExtJS cresce consideravelmente em um sistema real, dificultando bastante a manutenção, e uma forma de organizar o código é utilizar o MVC do próprio ExtJS, mas como já estamos utilizando o Asp.net MVC, teriamos dois MVCs! Duplicando assim algumas coisas, como a Model por exemplo, apesar de terem o mesmo nome, elas trabalham de formas diferentes. Gostaria de saber o que você pensa sobre esse assunto. Será que vale a pena trabalhar com os dois MVCs?
Igor
Realmente quando trabalhamos com esses dois frameworks algumas coisas duplicadas uma no FrontEnd e outra no BackEnd
Uma outra abordagem é fazer o ExtJs chamar um WCF, diminui um pouco essa duplicação, por exemplo não teremos um controller no BackEnd somente a parte de Model e Repository
att,
Leandro Prado