vistas vista validaciones una pagina mvc multiples modelos modelo misma establecer controlador asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 model-binding value-provider

asp.net-mvc - vista - mvc c#



Cómo asignar un 1 o 0 en un segmento de ruta MVC de ASP.Net en un parámetro de entrada de método de acción booleano (3)

Tenemos algunas aplicaciones PHP y Javascript que llaman a algunos puntos finales ASP.NET MVC. Digamos que tenemos este punto final:

public ActionResult DoSomething(bool flag) { }

Quiero que coincida con el valor de la bandera si paso en un número entero de 1 o 0, o paso una cadena de "verdadero" o "falso". ¿Qué parte del marco necesito implementar para hacer coincidir eso?


La mejor forma de hacerlo es usar un proveedor de valor personalizado. Si bien puede hacerlo con un archivador de modelo personalizado completo, es exagerado en función de sus requisitos, y es mucho más fácil simplemente implementar un proveedor de valor personalizado.

Para obtener alguna orientación sobre cuándo utilizar un archivador de modelo personalizado y cuándo usar un proveedor de valor personalizado, consulte aquí y aquí .

Puede simplemente crear un proveedor de valores personalizado para manejar valores de ruta que tengan una clave de "bandera" y manejar la conversión de int a bool en el proveedor de valores. El código para hacer esto se ve así:

public class IntToBoolValueProvider : IValueProvider { public IntToBoolValueProvider(ControllerContext context) { if (context == null) throw new ArgumentNullException("context"); this._context = context; } public bool ContainsPrefix(string prefix) { return prefix.ToLower().IndexOf("flag") > -1; } public ValueProviderResult GetValue(string key) { if (ContainsPrefix(key)) { int value = 0; int.TryParse(_context.RouteData.Values[key].ToString(), out value); bool result = value > 0; return new ValueProviderResult(result, result.ToString(), CultureInfo.InvariantCulture); } else { return null; } } ControllerContext _context; } public class IntToBoolValueProviderFactory : ValueProviderFactory { public override IValueProvider GetValueProvider(ControllerContext controllerContext) { return new IntToBoolValueProvider(controllerContext); } }

En el proveedor de valor, implementa el método ContainsPrefix para devolver verdadero para las claves de valor de ruta que le interesan, en este caso la clave "marca". En el indicador GetValue, convierte el valor de la entrada de datos de ruta "flag" a un int, y luego a un booleano, dependiendo de si el int es mayor que cero. Para todas las demás claves de datos de ruta que no son "bandera", simplemente devuelve nulo, que le dice al framework MVC que ignore este ValueProvider y pase a otros proveedores de valor.

Para conectar esto, debe implementar una subclase de ValueProviderFactory que crea el proveedor IntToBoolValueProvider personalizado. Además, debe registrar esta fábrica con el marco MVC. Puede hacer esto en global.asax utilizando la clase estática ValueProviderFactories:

protected void Application_Start() { ValueProviderFactories.Factories.Insert(0, new IntToBoolValueProviderFactory()); }

Si luego tiene una ruta configurada de la siguiente manera:

routes.MapRoute("", "{controller}/foo/{flag}", new { action = "Foo" });

esta ruta dirigirá las solicitudes a

http://localhost:60286/Home/Foo/{flag}

al método de acción

public ActionResult Foo(bool flag) { //Implement action method return View("Index"); }

Cuando el segmento {flag} es mayor que 0, el parámetro de entrada del indicador bool será verdadero, y cuando sea cero, el parámetro del indicador será falso.

Puede encontrar más sobre los proveedores de valor personalizado de MVC aquí .


¿Qué parte del marco necesito implementar para hacer coincidir eso?

Un clasificador de modelo personalizado.


Puede usar un archivador de modelo personalizado, como se encuentra en esta pregunta SO. Acciones de controlador MVC de ASP.NET con conversión de parámetro personalizado?

Ahora bien, si quisieras hacer esto globalmente, así no tendrías que establecer un atributo en cada bool que pudiera obtener un 0/1 en lugar de verdadero / falso, entonces puedes extender el encuadernador del modelo predeterminado para entender 0 o 1 como falso o true anulando el archivador de modelo predeterminado, como se encuentra en esta pregunta de SO. Cambie el archivador de modelo predeterminado en asp.net MVC

Alguna combinación de estos dos debería darte lo que quieres.