Я ищу оптимальное решение, которое направлено на уменьшение количества URL-адресов, жестко закодированных в приложении ASP.NET.
Например, при просмотре экрана сведений о продукте, выполнении редактирования этих сведений и последующей передаче изменений пользователь перенаправляется обратно на экран списка продуктов. Вместо того, чтобы кодировать следующее:
Response.Redirect("~/products/list.aspx?category=books");
Я бы хотел иметь решение, позволяющее мне сделать что-то вроде этого:
Pages.GotoProductList("books");
где Pages
является членом общего базового класса.
Я просто наплевал и хотел бы услышать любой другой способ, которым кто-либо управляет перенаправлениями своих приложений.
EDIT
Я закончил тем, что создал следующее решение: у меня уже был общий базовый класс, к которому я добавил перечисление Pages (спасибо Mark), каждый элемент имел атрибут System.ComponentModel.DescriptionAttribute
, содержащий URL страницы:
public enum Pages
{
[Description("~/secure/default.aspx")]
Landing,
[Description("~/secure/modelling/default.aspx")]
ModellingHome,
[Description("~/secure/reports/default.aspx")]
ReportsHome,
[Description("~/error.aspx")]
Error
}
Затем я создал несколько перегруженных методов для обработки различных сценариев. Я использовал отражение, чтобы получить URL-адрес страницы через атрибут Description
, и я передаю параметры строки запроса как анонимный тип (также используя отражение для добавления каждого свойства в качестве параметра строки запроса):
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));
}
Типичный вызов будет выглядеть так:
GotoPage(Enums.Pages.Landing, new {id = 12, category = "books"});
Комментарии