Estou usando o ASP.NET MVC e gostaria que todos os campos digitados pelo usuário fossem aparados antes de serem inseridos no banco de dados. E como tenho muitos formulários de entrada de dados, estou procurando uma maneira elegante de aparar todas as seqüências de caracteres, em vez de aparar explicitamente o valor de cada usuário fornecido. Estou interessado em saber como e quando as pessoas estão cortando as cordas.
Pensei em talvez criar um fichário de modelo personalizado e aparar qualquer valor de string lá ... dessa forma, toda a minha lógica de aparar está contida em um só lugar. Será esta uma boa abordagem? Existem exemplos de código que fazem isso?
asp.net
asp.net-mvc
model-binders
Johnny Oshika
fonte
fonte
type="password"
entradas intocadas?Esta é a @takepara com a mesma resolução, mas como um IModelBinder em vez de DefaultModelBinder, de modo que a adição do modelbinder no global.asax seja feita através de
A classe:
baseado em @haacked post: http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx
fonte
return
instruções e negando a condição:if (valueResult == null || string.IsNullOrEmpty(valueResult.AttemptedValue)) return null;
[AllowHtml]
atributo em propriedades modelo (juntamente com o[ValidateInput(false)]
como CodeGrue mencionado acimaUma melhoria na resposta do @takepara.
Em algum lugar no projeto:
Na mudança de classe TrimModelBinder
para
e você pode marcar propriedades a serem excluídas do corte com o atributo [NoTrim].
fonte
.Cast<object>().Any(a => a.GetType() == typeof(NoTrimAttribute))
por.OfType<NoTrimAttribute>().Any()
. Apenas um pouco mais limpo.Com as melhorias no C # 6, agora você pode escrever um fichário de modelo muito compacto que cortará todas as entradas de string:
Você precisa incluir esta linha em algum lugar do
Application_Start()
seuGlobal.asax.cs
arquivo para usar o fichário do modelo ao ligarstring
s:Acho que é melhor usar um fichário de modelo como esse, em vez de substituir o fichário de modelo padrão, porque ele será usado sempre que você estiver vinculando a
string
, seja diretamente como argumento de método ou como propriedade em uma classe de modelo. No entanto, se você substituir o fichário do modelo padrão, como sugerem outras respostas, isso funcionará apenas ao vincular propriedades nos modelos, e não quando você tiver umstring
argumento para um método de açãoEditar: um comentarista perguntou sobre como lidar com a situação em que um campo não deve ser validado. Minha resposta original foi reduzida para lidar apenas com a pergunta que o OP havia feito, mas para os interessados, você pode lidar com a validação usando o seguinte fichário de modelo estendido:
fonte
No ASP.Net Core 2, isso funcionou para mim. Estou usando o
[FromBody]
atributo em meus controladores e na entrada JSON. Para substituir a manipulação de string na desserialização JSON, registrei meu próprio JsonConverter:E este é o conversor:
fonte
Outra variante da resposta da @ takepara, mas com um toque diferente:
1) Prefiro o mecanismo de atributo "StringTrim" de opt-in (em vez do exemplo "NoTrim" de opt-out de @Anton).
2) É necessária uma chamada adicional para SetModelValue para garantir que o ModelState seja preenchido corretamente e que o padrão padrão de validação / aceitação / rejeição possa ser usado normalmente, por exemplo, TryUpdateModel (model) para aplicar e ModelState.Clear () para aceitar todas as alterações.
Coloque isso em sua entidade / biblioteca compartilhada:
Então isso em seu aplicativo / biblioteca MVC:
Se você não definir o valor da propriedade no fichário, mesmo quando não desejar alterar nada, bloqueará completamente essa propriedade do ModelState! Isso ocorre porque você está registrado como vinculando todos os tipos de cadeias, então parece (nos meus testes) que o fichário padrão não fará isso por você.
fonte
Informações adicionais para quem procura como fazer isso no ASP.NET Core 1.0. A lógica mudou bastante.
Eu escrevi um post sobre como fazê-lo , explica as coisas um pouco mais detalhadamente
Então, a solução ASP.NET Core 1.0:
Fichário de modelo para fazer o corte real
Além disso, você precisa do Model Binder Provider na versão mais recente, isso indica que esse fichário deve ser usado para este modelo
Em seguida, ele deve ser registrado no Startup.cs
fonte
Ao ler as excelentes respostas e comentários acima e ficar cada vez mais confuso, de repente pensei: ei, me pergunto se existe uma solução jQuery. Portanto, para outras pessoas que, como eu, acham o ModelBinders um pouco desconcertante, ofereço o seguinte trecho de jQuery que corta os campos de entrada antes que o formulário seja enviado.
fonte
No caso do MVC Core
Encadernador:
Fornecedor:
Função de registro:
Registro:
fonte
SimpleTypeModelBinderProvider
, mantendo o mesmo índice.Atrasado para a parte, mas a seguir há um resumo dos ajustes necessários para o MVC 5.2.3, se você deseja lidar com os
skipValidation
requisitos dos provedores de valor integrados.Global.asax
fonte
Eu discordo da solução. Você deve substituir GetPropertyValue porque os dados para SetProperty também podem ser preenchidos pelo ModelState. Para capturar os dados brutos dos elementos de entrada, escreva isto:
Filtre por propertyDescriptor PropertyType se você realmente estiver interessado apenas em valores de sequência, mas isso não deve importar, porque tudo o que entra é basicamente uma sequência.
fonte
Para o ASP.NET Core , substitua o
ComplexTypeModelBinderProvider
por um provedor que apara seqüências de caracteres.No seu
ConfigureServices
método de código de inicialização , adicione este:Defina
TrimmingModelBinderProvider
assim:A parte mais feia disso é a cópia e a colagem da
GetBinder
lógicaComplexTypeModelBinderProvider
, mas não parece haver nenhum gancho para permitir que você evite isso.fonte
Criei provedores de valor para aparar os valores dos parâmetros da string de consulta e os valores do formulário. Isso foi testado com o ASP.NET Core 3 e funciona perfeitamente.
Em seguida, registre as fábricas de provedores de valor na
ConfigureServices()
função em Startup.csfonte
Houve muitas postagens sugerindo uma abordagem de atributo. Aqui está um pacote que já possui um atributo trim e muitos outros: Dado.ComponentModel.Mutations ou NuGet
Após a chamada para Mutate (), user.UserName será alterado para
m@x_speed.01!
.Este exemplo irá aparar espaços em branco e colocar a string em minúsculas. Não introduz validação, mas
System.ComponentModel.Annotations
pode ser usado ao ladoDado.ComponentModel.Mutations
.fonte
Eu postei isso em outro tópico. No asp.net core 2, fui em uma direção diferente. Eu usei um filtro de ação. Nesse caso, o desenvolvedor pode configurá-lo globalmente ou usar como um atributo para as ações que deseja aplicar o corte de sequência. Esse código é executado após a ligação do modelo e pode atualizar os valores no objeto do modelo.
Aqui está o meu código, primeiro crie um filtro de ação:
Para usá-lo, registre-se como filtro global ou decore suas ações com o atributo TrimInputStrings.
fonte