webform tutorial route net mvc entre ejemplos diferencias attribute asp c# asp.net-mvc-4 url-rewriting routing asp.net-mvc-routing

c# - tutorial - Cambio de parámetros de URL con enrutamiento en MVC 4



webform mvc (1)

Varias de mis funciones API permiten los parámetros llamados ''attribute'' y ''attributeDelimiter'' (en singular), lo que significa que la URL esperada estaría en el formato de

SomeController / SomeAction? Aaa = bbb & attribute = ccc & attributeDelimiter = ddd.

También me gustaría permitir el soporte para el plural en esos nombres de param: ''atributos'' y ''atributosDelimitador''.

  1. ¿Hay alguna forma de volver a escribir la URL en RouteConfig? (convirtiendo los nombres en plural en singular)
  2. Si eso no es posible o no sería la mejor práctica, ¿cuál sería la mejor manera de hacer este tipo de reescritura?

MVC no utiliza el enrutamiento para valores de cadena de consulta. Los proveedores de valores proporcionan los valores de cadena de consulta a los métodos de acción. Entonces, para resolver este problema, solo necesita un proveedor de valor personalizado para manejar el caso de singular o plural.

Ejemplo

using System; using System.Collections.Specialized; using System.Globalization; using System.Web.Mvc; public class SingularOrPluralQueryStringValueProviderFactory : ValueProviderFactory { private readonly string singularKey; private readonly string pluralKey; public SingularOrPluralQueryStringValueProviderFactory(string singularKey, string pluralKey) { if (string.IsNullOrEmpty(singularKey)) throw new ArgumentNullException("singularKey"); if (string.IsNullOrEmpty(pluralKey)) throw new ArgumentNullException("pluralKey"); this.singularKey = singularKey; this.pluralKey = pluralKey; } public override IValueProvider GetValueProvider(ControllerContext controllerContext) { return new SingularOrPluralQueryStringValueProvider(this.singularKey, this.pluralKey, controllerContext.HttpContext.Request.QueryString); } } public class SingularOrPluralQueryStringValueProvider : IValueProvider { private readonly string singularKey; private readonly string pluralKey; private readonly NameValueCollection queryString; public SingularOrPluralQueryStringValueProvider(string singularKey, string pluralKey, NameValueCollection queryString) { if (string.IsNullOrEmpty(singularKey)) throw new ArgumentNullException("singularKey"); if (string.IsNullOrEmpty(pluralKey)) throw new ArgumentNullException("pluralKey"); this.singularKey = singularKey; this.pluralKey = pluralKey; this.queryString = queryString; } public bool ContainsPrefix(string prefix) { return this.GetSingularOrPluralValue(prefix) != null; } public ValueProviderResult GetValue(string key) { var value = this.GetSingularOrPluralValue(key); return (value != null) ? new ValueProviderResult(value, value.ToString(), CultureInfo.InvariantCulture) : null; } private bool IsKeyMatch(string key) { return (this.singularKey.Equals(key, StringComparison.OrdinalIgnoreCase) || this.pluralKey.Equals(key, StringComparison.OrdinalIgnoreCase)); } private string GetSingularOrPluralValue(string key) { if (this.IsKeyMatch(key)) { return this.queryString[this.singularKey] ?? this.queryString[this.pluralKey]; } return null; } }

Uso

public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); AuthConfig.RegisterAuth(); // Insert our value provider factories at the beginning of the list // so they override the default QueryStringValueProviderFactory ValueProviderFactories.Factories.Insert( 0, new SingularOrPluralQueryStringValueProviderFactory("attribute", "attributes")); ValueProviderFactories.Factories.Insert( 1, new SingularOrPluralQueryStringValueProviderFactory("attributeDelimiter", "attributesDelimiter")); } }

Ahora, en sus métodos de acción o incluso en las propiedades de sus modelos, ya sea que el valor se especifique como singular o plural en la cadena de consulta, los valores se completarán. Si tanto el singular como el plural están incluidos en la cadena de consulta, el valor singular tiene prioridad.

public ActionResult Index(string attribute, string attributeDelimiter) { return View(); }