Pergunta

Tenho brincado com o ASP.NET MVC Framework e a única coisa que realmente está me confundindo é como devo fazer a validação no lado do servidor dos dados de formulário postados.Presumo que não postei de volta no mesmo URL, mas se não o fizer, como faço para exibir novamente o formulário com os dados inseridos e as mensagens de erro?Além disso, para onde deve ir a lógica de validação?No modelo ou no controlador?Esta parece ser uma das poucas áreas onde os formulários web são muito mais fortes (sinto falta dos controles de validação).

Foi útil?

Solução

Você pode querer dar uma olhada na última postagem de ScottGu para ASP.Net anterior 5.Ele percorre um exemplo de validação que é muito interessante:

http://weblogs.asp.net/scottgu/archive/2008/09/02/asp-net-mvc-preview-5-and-form-posting-scenarios.aspx

Outras dicas

Aqui está uma visão geral do fluxo no MVC:

  1. /new - renderiza sua visualização "Nova" contendo um formulário para o usuário preencher
    • O usuário preenche o formulário e ele é postado em /create
    • A postagem é roteada para a ação Criar no seu controlador
    • No seu método de ação, atualize o modelo com os dados que foram postados.
    • Seu modelo deve se validar.
    • Seu Controller deve ler se o modelo é válido.
    • Se o modelo for válido, salve-o em seu banco de dados.Redirecione para /show para renderizar a visualização show do seu objeto.
    • Se o Modelo for inválido, salve os valores do formulário e as mensagens de erro no TempData e redirecione novamente para a ação Novo.Preencha os campos do formulário com os dados do TempData e mostre a(s) mensagem(s) de erro.

As estruturas de validação irão ajudá-lo neste processo.Além disso, acho que a equipe da ASP.NET MVC está planejando uma estrutura de validação para a próxima visualização.

Pelo que sei, todos ainda estão tentando descobrir a maneira "padrão" de fazer isso.Dito isso, confira as últimas postagens de Phil Haack e Scott Guthrie sobre MVC e você encontrará algumas informações interessantes sobre como eles se saíram.Quando eu estava brincando com isso, criei um ModelBinder para a classe de dados LinqToSql que eu havia gerado.Você pode conferir esta postagem para descobrir como montar um ModelBinder básico:

Fichário de modelo ASP.Net MVC

Na sua ação, se você tivesse criado um ModelBinder "Produto", você apenas declararia a ação assim:

public ActionResult Novo (produto do produto)

E o model binder cuidará de atribuir os dados postados às propriedades dos objetos, desde que você os tenha construído corretamente de qualquer maneira.

Depois disso dentro do seu método GetValue() você pode implementar qualquer validação que desejar, seja usando exceções, regexs, ou o que quer que você possa fazer uma chamada como:

(ModelStateDictionary_name).AddModelError("form_element_id", "entered_value", "error_message");

Então você pode simplesmente lançar um <%= Html.ValidationSummary() %> em sua visualização para exibir todos os seus erros.

Para validação do lado do cliente usei apenas jQuery.Depois de configurar uma amostra básica, você pode começar a fazer algumas coisas interessantes combinando tudo isso com visualizações parciais e chamadas Ajax.

Você já deu uma olhada nisso?http://www.codeplex.com/MvcValidatorToolkit

Citado na página

O Validator Toolkit fornece um conjunto de validadores para a nova estrutura ASP.NET MVC para validar formulários HTML no cliente e no lado do servidor usando conjuntos de validação.

Receio que alguém com mais experiência em MVC do que eu teria que falar sobre onde na arquitetura você deve colocar as coisas.

Estou aprendendo a estrutura MVC também, então não tenho certeza de quão estranho isso é, mas pelo que entendi, você teria um formulário em uma visualização como Edit.aspx.Este formulário seria então postado no controlador para outro método de ação, como Update(), passando o conteúdo do formulário que você definiu em Edit.aspx como parâmetros.

Update(int id, string name, string foo)

Você poderia fazer a validação dentro desse método.Se tudo estiver bem,

return View("Item", yourObject)

Castelo.Componentes.Validador módulo no projeto Castle.É muito ágil e poderoso.Ele gera regras de validação baseadas em atributos do modelo (ou qualquer outra fonte) e ainda é capaz de gerar validação JS usando jQuery, Prototype Validation, fValidate e outros.É claro que é aconselhável abstrair o validador atrás da interface IValidationEngine.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top