gpt4 book ai didi

ASP.NET - 避免硬编码路径

转载 作者:行者123 更新时间:2023-12-02 12:01:29 26 4
gpt4 key购买 nike

我正在寻找一种最佳实践解决方案,旨在减少 ASP.NET 应用程序中硬编码的 URL 数量。

例如,当查看产品详细信息屏幕、对这些详细信息进行编辑然后提交更改时,用户将被重定向回产品列表屏幕。而不是编写以下代码:

Response.Redirect("~/products/list.aspx?category=books");

我希望有一个解决方案可以让我做这样的事情:

Pages.GotoProductList("books");

其中Pages是公共(public)基类的成员。

我只是在这里吐槽一下,很想听听任何人管理应用程序重定向的任何其他方式。

编辑

我最终创建了以下解决方案:我已经有了一个公共(public)基类,我向其中添加了一个 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
}

然后我创建了一些重载方法来处理不同的场景。我使用反射通过页面的 Description 属性获取页面的 URL,并将查询字符串参数作为匿名类型传递(还使用反射将每个属性添加为查询字符串参数):

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"});

评论?

最佳答案

我建议您从 Page 类派生自己的类(“MyPageClass”)并在其中包含此方法:

public class MyPageClass : Page
{
private const string productListPagePath = "~/products/list.aspx?category=";
protected void GotoProductList(string category)
{
Response.Redirect(productListPagePath + category);
}
}

然后,在您的代码隐藏中,确保您的页面派生自此类:

 public partial class Default : MyPageClass
{
...
}

其中,您只需使用以下命令即可重定向:

 GotoProductList("Books");

现在,这有点有限,因为您无疑会有各种其他页面,例如 ProductList 页面。您可以在页面类中为它们中的每一个提供自己的方法,但这有点糟糕并且不能顺利扩展。

我通过保留一个带有页面名/文件名映射的数据库表来解决类似的问题(我正在调用外部动态添加的HTML文件,而不是ASPX文件,所以我的需求有点不同,但我认为这些原则适用)。然后,您的调用将使用字符串或更好的枚举来重定向:

 protected void GoToPage(PageTypeEnum pgType, string category)
{
//Get the enum-to-page mapping from a table or a dictionary object stored in the Application space on startup
Response.Redirect(GetPageString(pgType) + category); // *something* like this
}

在您的页面上,您的调用将是:GoToPage(enumProductList, "Books");

好的一点是,调用是对祖先类中定义的函数(不需要传递或创建管理器对象),并且路径非常明显(如果您使用枚举,智能感知将限制您的范围)。

祝你好运!

关于ASP.NET - 避免硬编码路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2102059/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com