Estoy buscando una solución de mejores prácticas que tenga como objetivo reducir la cantidad de URL que están codificadas en una aplicación ASP.NET.ASP.NET - Evite las rutas de codificación rígida
Por ejemplo, cuando se visualiza una pantalla de detalles del producto, se realiza una edición de estos detalles y luego se envían los cambios, el usuario se redirige a la pantalla de lista de productos. En lugar de codificar el siguiente:
Response.Redirect("~/products/list.aspx?category=books");
me gustaría tener una solución en el lugar que me permite hacer algo como esto:
Pages.GotoProductList("books");
donde Pages
es un miembro de la clase base común.
Simplemente estoy escupiendo aquí, y me encantaría escuchar cualquier otra forma en la que cualquiera haya logrado redirigir su aplicación.
EDITAR
que acabó creando la siguiente solución: Yo ya tenía una clase base común, a la que añadí una enumeración de páginas (gracias Mark), con cada elemento tiene un atributo System.ComponentModel.DescriptionAttribute
que contiene la dirección URL de la página :
public enum Pages
{
[Description("~/secure/default.aspx")]
Landing,
[Description("~/secure/modelling/default.aspx")]
ModellingHome,
[Description("~/secure/reports/default.aspx")]
ReportsHome,
[Description("~/error.aspx")]
Error
}
Luego creé algunos métodos sobrecargados para manejar diferentes escenarios. Solía reflexión para obtener la URL de la página a través de su Description
atributo, y paso los parámetros de cadena de consulta como un tipo anónimo (también utilizando la reflexión de añadir cada propiedad como un parámetro de cadena de consulta):
private string GetEnumDescription(Enum value)
{
Type type = value.GetType();
string name = Enum.GetName(type, value);
if (name != null)
{
FieldInfo field = type.GetField(name);
if (field != null)
{
DescriptionAttribute attr = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
if (attr != null)
return attr.Description;
}
}
return null;
}
protected string GetPageUrl(Enums.Pages target, object variables)
{
var sb = new StringBuilder();
sb.Append(UrlHelper.ResolveUrl(Helper.GetEnumDescription(target)));
if (variables != null)
{
sb.Append("?");
var properties = (variables.GetType()).GetProperties();
foreach (var property in properties)
sb.Append(string.Format("{0}={1}&", property.Name, property.GetValue(variables, null)));
}
return sb.ToString();
}
protected void GotoPage(Enums.Pages target, object variables, bool useTransfer)
{
if(useTransfer)
HttpContext.Current.Server.Transfer(GetPageUrl(target, variables));
else
HttpContext.Current.Response.Redirect(GetPageUrl(target, variables));
}
Un la llamada típica se vería así:
GotoPage(Enums.Pages.Landing, new {id = 12, category = "books"});
Comentarios?
Terminé haciendo algo similar a esto (ver la edición anterior), y lo marcaré como aceptado porque utilicé la idea de páginas enum. Gracias Mark. – staterium