Estoy usando ASP.NET MVC y me gustaría que todos los campos de cadena ingresados por el usuario se recorten antes de insertarlos en la base de datos. Y dado que tengo muchos formularios de entrada de datos, estoy buscando una forma elegante de recortar todas las cadenas en lugar de recortar explícitamente cada valor de cadena proporcionado por el usuario. Me interesa saber cómo y cuándo las personas recortan las cuerdas.
Pensé en crear un archivador de modelo personalizado y recortar cualquier valor de cadena allí ... de esa manera, toda mi lógica de recorte está contenida en un solo lugar. ¿Es este un buen enfoque? ¿Hay ejemplos de código que hagan esto?
asp.net
asp.net-mvc
model-binders
Johnny Oshika
fuente
fuente
type="password"
entradas intactas?Esta es @takepara la misma resolución, pero como IModelBinder en lugar de DefaultModelBinder, por lo que agregar el modelbinder en global.asax es a través de
La clase:
basado en la publicación @haacked: http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx
fuente
return
declaraciones y negando la condición:if (valueResult == null || string.IsNullOrEmpty(valueResult.AttemptedValue)) return null;
[AllowHtml]
atributo en las propiedades del modelo (junto con el[ValidateInput(false)]
CodeGrue mencionado anteriormenteUna mejora a la respuesta de @takepara.
Algunos estaban en proyecto:
En el cambio de clase TrimModelBinder
a
y puede marcar las propiedades que se excluirán del recorte con el atributo [NoTrim].
fuente
.Cast<object>().Any(a => a.GetType() == typeof(NoTrimAttribute))
por.OfType<NoTrimAttribute>().Any()
. Solo un poco más limpio.Con mejoras en C # 6, ahora puede escribir una carpeta modelo muy compacta que recorta todas las entradas de cadena:
Debe incluir esta línea en algún lugar de
Application_Start()
suGlobal.asax.cs
archivo para usar el modelo de carpeta cuando enlacestring
s:Creo que es mejor usar un cuaderno de modelo como este, en lugar de anular el cuaderno de modelo predeterminado, porque luego se usará siempre que enlace un
string
, ya sea directamente como un argumento de método o como una propiedad en una clase de modelo. Sin embargo, si anula la carpeta predeterminada del modelo como sugieren otras respuestas aquí, eso solo funcionará cuando se vinculan propiedades en los modelos, no cuando tienestring
un argumento para un método de acciónEditar: un comentarista preguntó sobre cómo lidiar con la situación cuando un campo no debe ser validado. Mi respuesta original se redujo para tratar solo con la pregunta que el OP había planteado, pero para aquellos que estén interesados, puede lidiar con la validación utilizando el siguiente archivador de modelo extendido:
fuente
En ASP.Net Core 2 esto funcionó para mí. Estoy usando el
[FromBody]
atributo en mis controladores y entrada JSON. Para anular el manejo de cadenas en la deserialización JSON, registré mi propio JsonConverter:Y este es el convertidor:
fuente
Otra variante de la respuesta de @ takepara pero con un giro diferente:
1) Prefiero el mecanismo de atributo "StringTrim" de aceptación (en lugar del ejemplo de exclusión "NoTrim" de @Anton).
2) Se requiere una llamada adicional a SetModelValue para garantizar que ModelState se complete correctamente y que el patrón de validación / aceptación / rechazo predeterminado se pueda usar de forma normal, es decir, TryUpdateModel (modelo) para aplicar y ModelState.Clear () para aceptar todos los cambios.
Ponga esto en su entidad / biblioteca compartida:
Entonces esto en su aplicación / biblioteca MVC:
Si no establece el valor de la propiedad en la carpeta, incluso si no desea cambiar nada, ¡bloqueará esa propiedad de ModelState por completo! Esto se debe a que está registrado como enlace para todos los tipos de cadenas, por lo que parece (en mis pruebas) que el cuaderno predeterminado no lo hará por usted.
fuente
Información adicional para cualquiera que busque cómo hacer esto en ASP.NET Core 1.0. La lógica ha cambiado bastante.
Escribí una publicación de blog sobre cómo hacerlo , explica las cosas en un poco más detallado
Entonces, la solución ASP.NET Core 1.0:
Modelo de carpeta para hacer el recorte real
También necesita Model Binder Provider en la última versión, esto indica que si se usa este aglutinante para este modelo
Luego tiene que estar registrado en Startup.cs
fuente
Mientras leía las excelentes respuestas y comentarios anteriores, y cada vez me confundía más, de repente pensé, oye, me pregunto si hay una solución jQuery. Entonces, para otros que, como yo, encuentran ModelBinders un poco desconcertante, les ofrezco el siguiente fragmento de jQuery que recorta los campos de entrada antes de que se envíe el formulario.
fuente
En caso de MVC Core
Aglutinante:
Proveedor:
Función de registro:
Registrarse:
fuente
SimpleTypeModelBinderProvider
mantener el mismo índice.Tarde a la fiesta, pero el siguiente es un resumen de los ajustes necesarios para MVC 5.2.3 si debe manejar el
skipValidation
requisito de los proveedores de valor incorporado.Global.asax
fuente
No estoy de acuerdo con la solución. Debe anular GetPropertyValue porque ModelState también puede completar los datos de SetProperty. Para capturar los datos sin procesar de los elementos de entrada, escriba esto:
Filtre por propertyDescriptor PropertyType si realmente solo le interesan los valores de cadena, pero no debería importar porque todo lo que viene es básicamente una cadena.
fuente
Para ASP.NET Core , reemplace el
ComplexTypeModelBinderProvider
con un proveedor que recorta cadenas.En su
ConfigureServices
método de código de inicio , agregue esto:Definir
TrimmingModelBinderProvider
así:La parte fea de esto es copiar y pegar la
GetBinder
lógicaComplexTypeModelBinderProvider
, pero no parece haber ningún enganche que te permita evitar esto.fuente
Creé proveedores de valores para recortar los valores de los parámetros de la cadena de consulta y los valores del formulario. Esto fue probado con ASP.NET Core 3 y funciona perfectamente.
Luego registre las fábricas de proveedores de valor en la
ConfigureServices()
función en Startup.csfuente
Ha habido muchas publicaciones que sugieren un enfoque de atributo. Aquí hay un paquete que ya tiene un atributo trim y muchos otros: Dado.ComponentModel.Mutations o NuGet
Después de la llamada a Mutate (), user.UserName será mutado a
m@x_speed.01!
.Este ejemplo recortará espacios en blanco y pondrá la cadena en minúsculas. No introduce validación, pero
System.ComponentModel.Annotations
se puede usar juntoDado.ComponentModel.Mutations
.fuente
Publiqué esto en otro hilo. En asp.net core 2, fui en una dirección diferente. Usé un filtro de acción en su lugar. En este caso, el desarrollador puede configurarlo globalmente o utilizarlo como un atributo para las acciones que desea aplicar el recorte de cadena. Este código se ejecuta después de que se haya realizado el enlace del modelo y puede actualizar los valores en el objeto del modelo.
Aquí está mi código, primero cree un filtro de acción:
Para usarlo, regístrese como filtro global o decore sus acciones con el atributo TrimInputStrings.
fuente