Unobtrusive jQuery Validation com forms dinâmicos

03/05/2013 21:53:00 By Felipe Pessoto

Recentemente tive um problema ao usar um form dinâmico no ASP.NET MVC. A validação não "intrusiva" é processada assim que a página termina de carregar, e a partir daquele momento não é mais alterada. Porém eu tinha uma página que carregava todo o conteúdo do form via Ajax, e neste caso é ainda pior do que carregar um novo form, pois se o form já existia ele é marcado para não ser processado novamente, então preciso primeiro desmarca-lo e depois ativar a validação novamente. O código é simples, só não é algo suportado ou documentado, e depende de detalhes da implementação atual:

var form = $('#form-adiciona-entrega');

form.removeData('validator').removeData('unobtrusiveValidation');//Este passo só é necessário se o form já existia. Se o form em si é gerado dinamicamente, não precisa desse "reset"

$.validator.unobtrusive.parse(form);

 

Encontrei também este código, que diz fazer isso automaticamente a cada chamada ajax, mas que depende também de detalhes do ASP.NET MVC:

$(document).ajaxSuccess(function (event, xhr, settings) {
   if (settings.mvcTargetElement) {
       $(settings.mvcTargetElement.getAttribute("data-ajax-update")).each(function () {
          $.validator.unobtrusive.parse(this);
     });
  }
});

 

Fontes:

http://btburnett.com/2011/01/mvc-3-unobtrusive-ajax-improvements.html

http://stackoverflow.com/questions/11045256/jquery-client-side-validate-not-working

ASP.NET MVC, usando Array, List, IEnumerable no ViewModel e ModelBind

11/16/2012 18:44:00 By Felipe Pessoto

Um problema comum que sempre me fazia perder um bom tempo e deixava o código um pouco mais sujo era trabalhar com Arrays ou melhor, IEnumerable's em geral. Normalmente tenho um IEnumerable<AlgumaCoisa> no meu ViewModel e quero usar todas as funcionalidades do ASP.NET MVC normalmente com o Model Binding.

Assumindo o seguinte ViewModel:

public class PredioViewModel
{
    public string Nome { get; set; }
    public List<AndarViewModel> Andares { get; set; }
}
public class AndarViewModel
{
    public int Id { get; set;}
    public string Nome { get; set; }
    public decimal Preco { get; set; }
}

Read more...

ASP.NET MVC Windows Authentication redirecionando pro login

09/25/2012 22:29:23 By Felipe Pessoto

Esse problema aconteceu em um novo projeto que estou trabalhando na Athié, em ASP.NET MVC 4, mas deve acontecer no 3 também, já que acredito ser um problema no WebPages utilizado pelo Razor. Não sei exatamente o motivo, mas o WebPages sobrescreve algumas configurações de Membership para "facilitar" o uso do WebMatrix. Não concordo com a decisão já que o produto principal não é o WebMatrix. De qualquer forma, o problema é o seguinte, já configurei o web.config pra usar Windows Authentication, com e sem impersonate e o primeiro request sempre redirecionava para a url de login que no caso não existe e dá erro 404. Pensei ser um problema do Chrome, mas também acontecia com o Firefox, exceto com o Internet Explorer.

Para solucionar o problema é preciso colocar essa chave no appSettings:

<add key="enableSimpleMembership" value="false"/>

Voltando o Membership ao padrão em vez de sobrescrever pelo Membership do WebPages.

É estranho que o ASP.NET MVC 3 e 4 vem com templates de Intranet e os mesmos não incluem essa chave.

UPDATE: A raiz do problema está na presença da dll WebMatrix.Data.dll. No meu caso ela estava presente pois o projeto foi criado com o template Internet e depois alterado pra Windows Authentication. Removendo essa dll não precisa da chave no web.config

Criando NuGet Packages - Parte 1 - Convenções

08/30/2012 07:05:39 By Felipe Pessoto

Nos posts anteriores expliquei como criar seu próprio Feed Nuget, mas a grande vantagem é poder publicar seus Packages personalizados, permitindo distribuir para os Developers as bibliotecas usadas na sua empresa.

Antes de começarmos, vou explicar algumas convenções usadas, vou basicamente copiar a documentação original:

Package Id:

Os Packages devem seguir o mesmo padrão de nomenclatura dos namespaces no .NET. Por exemplo, Ninject.Mvc3 em vez de Ninject-Mvc3.

Packages de exemplo: Use o sufixo ".Sample" para o package, por exemplo, se o nome do seu package é Clay, então o exemplo de como usar clay será Clay.Sample. Também, dentro da pasta content, organize seus exemplos dentro de a estrutura /Samples/PackageID. Por exemplo, o package Clay.Sample deverá ter uma pasta /Samples/Clay.

Conteúdo do Package

Pasta App_Start: Quando usar o package WebActivator, coloque todo o código de inicialização da aplicação em uma pasta App_Start dentro da pasta Content. Veja este post para mais detalhes.

Assemblies: Em geral, faz sentigo ter um package por assembly. Em alguns casos, se sua biblioteca tem assemblies que não fazem sentigo em qualquer outro contexto exceto dentro da sua biblioteca, então tudo bem colocar estes assemblies dentro do mesmo package. Por exemplo, se você tem um Foo.dll que depende do Bar.dll e você acha que alguem pode depender do Bar.dll, então faça dois packages. Mas se você tem Foo.dll e Foo.resources.dll, então não faz sentido ter duas packages separadas.

Versionamento do Package

Para entender o versionamento no NuGet, a seguinte série de 3 posts é muito importante (e rápida!) Leia: NuGet Versioning Part 1: Taking on DLL HellPart 2: The core algorithmPart 3: Unification via Binding Redirects.

Escolhendo uma Versão: Em geral, faz sentido version o package de acordo com a versão da biblioteca, mas não esqueça as regras de versionamento que o NuGet usa caso sua biblioteca tem um esquema de versionamento não padronizado. Em geral é recomendado que a versão do package corresponda à biblioteca, mas não é obrigatório.