Para manipulacao do DOM eu tenho total preferencia pelo jquery, ja para geracao de grids e afins o framework Ext JS, realmente e insuperavel, a curva de aprendizagem dele, nao e das melhores e faltam exemplos praticos na internet sobre a geracao pratica de grids (pelo menos ao meu ponto de vista), porem uma vez dominado, se torna uma ferramenta tao poderosa, que voce chega se perguntar como pode viver sem isso ate hoje.Hoje vou postar sobre como gerar uma grid com registros agrupados, e botoes de acao.Inicialmente quero frisar que o framework Ext Js e pago, sendo liberado apenas para projetos open source, porem o custo x beneficio dele e muito bom mesmo.Primeiro baixem o framework no site Sencha.Uma vez salvo no computador local, vamos instala-lo:Por motivos de organizacao eu optei por colocar os .js na pasta Content > Ext, e as imagens em resources > images como mostra na figura abaixoNa pasta Ext tem todos os arquivos java do framework enquanto na images tem as imagens do framework.Abra um projeto de nome de sua preferencia e vamos instalar o framework nele.<link rel="stylesheet" href="@Url.Content("~/Content/ext/css/ext-all.css")" type="text/css" media="screen" /><script type="text/javascript" src="@Url.Content("~/Content/ext/js/ext-all.js")"></script>Aqui existem algumas observacoes:Em muitos exemplos pela internet afora eu vejo as pessoas referenciando seus arquivos de forma manual, eu nao vejo isso como certo, porem eu gosto de desenvolver localmente e fazer o deploy de arquivos apenas quando necessario mesmo, entao nesse caso, para poder ter mais produtividade eu uso o "URL.Content" que "descobre" a estrutura de pasta que se encontra e ja a usa de forma correta.Voltando ao sssunto principal, basta referenciarmos esses dois arquivos que o framework ja estara instalado.No Mvc, o correto e gerar models "gordas", com todo o processamento entao em uma interface eu criei um content result como se segue: public ContentResult XmlUsuariosGrupos(string Conf) { BancoEntities BD = new BancoEntities(); //reconstruindo o helper para dar o action no link------------------------------------------------------------------------------- HttpContextWrapper httpContextWrapper = new HttpContextWrapper(System.Web.HttpContext.Current); UrlHelper urlHelper = new UrlHelper(new RequestContext(httpContextWrapper, RouteTable.Routes.GetRouteData(httpContextWrapper))); //------------------------------------------------------------------------------------------------------------------------------- var Listagem = (from usu_grupos in BD.usu_grupos from usuarios in BD.usuarios where usuarios.CodGrupo == usu_grupos.Usu_Gru_Cod && usu_grupos.Conf_Codigo == Conf select new { usu_grupos.Usu_Gru_Nome, usuarios.Nome, usuarios.Sobrenome, usuarios.CodUsuario, usuarios.CodGrupo }); XElement matches = new XElement("Grupos"); XElement match = null; XDocument doc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), matches); foreach (var item in Listagem) { match = new XElement("Agrupamento"); match.Add(new XElement("id", item.CodUsuario)); match.Add(new XElement("Nome", item.Nome + " " + item.Sobrenome)); match.Add(new XElement("Grupo", item.Usu_Gru_Nome)); match.Add(new XElement("Acoes", "<a href='" + urlHelper.Action("EditaDireitosEspeciais", "Iniciais", new { id = item.CodUsuario, CodGrupo = item.CodGrupo } ) + "'>Gerenciar Direitos Especiais</a>")); matches.Add(match); } ContentResult ret = new ContentResult(); ret.ContentType = "text/xml"; ret.Content = doc.ToString(); return ret; }Com isso geramos um xml satisfatorio para o Framework, vamos prestar atencao em um detalhe: no contexto de model o helper do action link nao funciona, sendo que e necessario reconstruir o mesmo dentro do ContentResult para o mesmo poder ser utilizado, afinal por mais utilidade que se tenha uma listagem, ela nao passa apenas de uma listagem, e as vezes precisamos de botoes de acao, para edicao de usuarios, CRUDS em geral, etc.Na nossa view eu coloquei o