Arquivos da categoria: MVC

Razor Helper – Menu dinâmico

O que falar do Razor que eu já considero tanto? rs
MVC é coisa linda demais, incrivelmente mais limpo, prático, rápido, etc etc. Não sei nem porque a Microsoft não já matou o WebForms.

Mas então.. estava montando um menuzinho dinâmico aqui de possíveis N gerações (?).
Mandei um helper para fazer o loop ad æternum, se liga só:

@helper MontarMenu(List<Menu> menus)
{
    foreach (Menu item in menus)
    {
        <li>
            <a href="item.Url">
                @item.Descricao
            </a>
 
            @if (item.Filhos != null && item.Filhos.Count > 0)
            {
                <ul>
                    @MontarMenu(item.Filhos)
                </ul>
            }
        </li>        
      }
}

Para chamar o lindão:

<div id="menucontainer">
	<ul id="menu">
		@if (ViewBag.Menu() != null && ViewBag.Menu().Count > 0)
		{
			@:@MontarMenu(ViewBag.Menu())
		}
	</ul>
</div>

Simples como a vida tem quer ser.
Amem.

E larguem o WebForms! :~

Could not load file or assembly ‘DotNetOpenAuth.Core’

Delicias a parte <3, estamos começando o ano com bug! Criei um projeto C# e depois transformei ele em MVC, fazer aquelas referencias na mão é hard. Fiquei com um erro chatão que não é nem um pouco auto explicável. O bendito era:
“Could not load file or assembly ‘DotNetOpenAuth.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)”

Para resolve-lo basta checkar o Copy Local como true na referencia do MVC.

Problema resolvido e happy new year!

Pingado – Monitoramento de webservices

SOA! Ando respirando isso, ai ai. Lembro a 2 anos atras quando eu queria pq queria viver isso day-by-day … Demorou, mas estou aqui, ein? Hehehehe. E ainda bem que demorou, hoje entendo a maturidade que um dev precisa ter para levar um projeto bacana nessa arquitetura .. seguimos aprendendo! But let’s go 🙂

A vida não é só flores e amor, preciso medir a disponibilidade de um projeto … preciso de alertas para manter essa disponibilidade caso ela esteja em risco. Como tudo é serviço, uma das maneiras que pensei em manter o espirito de escoteiro (SEMPRE ALERTA!) é pingando os benditos! Incrivelmente não achei nada free para fazer isso, estou cheia de coisas para testar (windows 8, visual studio 2012, github, frameworks, etc.) entao resolvi dar um start nisso. Vamos ver até onde vou!

FIRST STEP, instalar esse ambiente que quero testar.

Windows 8 tá muito rápido e a usabilidade dele tá maneira. É meio chato de inicio porque já estamos no modo automatico com a barra de inicialização e tal, mas uma semaninha usando como usuario n00b e já estou bem familiarizada. Ele é bonitão e não achei nada contra ainda além de ter que ter conta na live. Bug todo mundo tem então … pls, don’t tell me that gave a blue screen.

http://www.reddit.com/r/windows8/comments/1d3dok/why_dont_people_like_windows_8/
http://www.techradar.com/reviews/pc-mac/software/operating-systems/windows-8-1093002/review
http://www.reddit.com/r/windows8/comments/168ybd/windows_8_is_a_fantastic_os_why_do_so_many_people/

Visual Studio 2012: IDE mais sensacional não ha! Acho que é ela quem mantém meu relacionamento sério com o .NET. Dá um look http://msdn.microsoft.com/en-us/library/vstudio/bb386063.aspx.

Cadastrinho maroto no Github. Eu havia feito um teste já acompanhando o curso da Code School: Try Git. Recomendo, é free e objetivo.

Instalei também o plugin para o VS.

E claro, meu tema preferido do VS. Aqui tem mais: http://studiostyl.es/.

Ambiente semi pronto, proximo post tem codigo com farinha.

Calling a controller method from view

Chamando um metódo do controle a partir da view. Coisa simples.

 

Tenho convivido com 347 linguagens diferentes, mindfucker total, mas que visão que dá, ein? Ponte que partiu.

Tava implementando um esquema de mensagens num projeto com MVC 3 que se auto destrói depois de ser exibida, a la rails (flash), só que incrivelmente tive um tico de dificuldade para acessar um método do meu controller. Achei interessante registrar a solução.

Como a mensagem é algo padrão, eu implementei no meu controller genérico para setar a ViewBag ever com as minhas funções necessárias:

public bool ContemMensagem()
{
     if (!string.IsNullOrWhiteSpace(_mensagem))
     {
           return true;
     }
     else
     {
           return false;
     }
}
 
protected override IActionInvoker CreateActionInvoker()
{
      ViewBag.ContemMensagem = new Func(ContemMensagem);
}

Dá pra fazer coisa pra xuxu com isso. E por favor, paremos de codificar na view, rs!

Qqr sugestão mais elegante para isso, estamos aí.

 
 

MVC Helper customizado (paginação)

Paginação! Me dá uma agonia quando usam alguma artimanha em html/javascript pra “paginar”, quem será que eles querem enganar carregando tudo na primeira página e depois dando um tapinha pra nao ficar com muita barra de rolagem?
Paginação é importante também para diminuir o peso na pagina, carregar tudo do banco de uma vez é péssimo .. tem gente que tem internet ruim, acho triste pensar tão pouco no usuário. 🙁

Enfim, como eu tenho trabalhado bastante nos ultimos tempos com MVC 3 e eu acho a coisa mais linda do mundo aqueles helpers do razor, implementei um helperzinho para me ajudar com paginação! Iupi!

O helper nada mais é que uma classe estática com métodos estáticos que recebem o System.Web.Mvc.HtmlHelper, assim referenciamos a biblioteca no system.web.webPages.razor e conseguimos usa-la pelo helper do Razor, vulgo @Html.

Vamos ao meu exemplinho!

namespace raposa
{
	public static class paginacaoOfDeath
	{
		public static MvcHtmlString CriarPaginacao(this HtmlHelper helper, int quantidadeDePaginas, int paginaAtual)
		{
			return new MvcHtmlString("HTML DA PAGINAÇÃO");
		}
	}
}

No Web.config das views eu adiciono referência da biblioteca do meu helper maneirão.

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="raposa" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

Depois para usar ..

@Html.CriarPaginacao(500, 1)

AWAY!

Microsoft.Web.Helpers – FileUpload – N upload de arquivo(s)

Quão chato é ficar toda hora fazendo relacionamento 1 para N nas telas? PQP. Todo dia a mesma coisa.
Estava eu aqui fazendo essa coisa maravilinda de Deus mais uma vez again novamente, porém o helper do MVC 3 não possui o FileUpload (pelo menos não achei).
Dei uma pesquisada rápida e achei um helper da Microsoft especifico para isso, vulgo Microsoft Web Helper. Adicionei pelo NuGet pesquisando por “microsoft-web-helpers”.

Na ViewModel, declarei uma IEnumerable de HttpPostedFileBase para receber os arquivos.
E na view, simplesmente um

@Microsoft.Web.Helpers.FileUpload.GetHtml(
name: “nomeDoObjeto.nomeDaPropriedade”,
addText: “Adicionar anexo”,
includeFormTag: false
)

E ele já cria (ou não, de acordo com sua parametrização na linha acima) a possibilidade de adicionar N inputs file. I’m in love <3

Deploying MVC

Uma dúvida que eu sempre tive era porque o Visual Studio não fazia o deploy das dlls de dependencia de um projeto por default. Tudo bem que é redundante em um server você ter N dlls para a mesma coisa: MVC. Mas se levarmos em consideração que as dlls são simples códigos pré escritos, é estranho. Se substituirmos a tecnologia por PHP, por exemplo, e o MVC da Microsoft por CodeIgniter, você simplesmente baixa o código e escreve em cima dele. Ruby On Rails the same. Tudo bem que tem razões para ser centralizado isso e melhor gerenciado, mas sendo particularidade de projetos, é estranho, rs.
Mas enfim .. não sendo default, é sempre incoveniente você ter que instalar algo num servidor de produção, e mais chato ainda você ter que olhar referencia por referencia num projeto e ver o que é necessário setar como “Copy Local” ou não.

Hoje minha vida mudou!! Descobri (com ajuda do Raposa-não-se- o-blog, obrigada!) que existe uma maneira belezinha de setar que queremos as dlls necessárias para um framework sejam copiadas para a bin quando publicarmos.

“Add deployable dependencies ..” é coisa linda de Deus. Veja mais.

Nada como uma pesquisada na ferramenta maravilinda$$$$ que usamos diariamente .. {:

AuthorizeAttribute – MVC .NET

Ninguém mais usa a autenticação default da vida no .nerd?
Impressionante que a galera prefere verificar uma sessão e dar um redirect em cada action de todos os controles da galacta, mas nao dá uma pesquisadinha rápida, nem que seja só pra centralizar isso.

public class Autenticacao
        : <a href="http://msdn.microsoft.com/pt-br/library/system.web.mvc.authorizeattribute.aspx">AuthorizeAttribute</a>
    {
        protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
        {
            if (httpContext.Session["usuario"] == null)
                return false;
 
            return true;
        }
    }

e pra usar

public class PropostaController 
        : Controller
    {
        [Autenticacao]
        public ActionResult Index()
        {
            return View();
        }
   }

Diminui umas 666 linhas de código que dói na alma só com essa besteirinha aí .. vamo pensar pra codificar, Brasil!