我可以编程方式根据类找到Web表单的URL吗?

时间:2009-11-12 17:08:51

标签: asp.net

如果我有一个网页表格,例如〜/ Page1.aspx,它实现了代码隐藏文件中定义的Page1类,是否有任何方式可以编程方式根据类型确定URL(〜/ Page1.asp);

之类的东西
string url = GetUrlOfWebForm(typeof(Page1));

或者也许来自班级的实例

string url = GetUrlOfWebForm(new Page1());

因此,如果移动/重命名页面,则会更新链接到页面的任何代码,如果页面被删除,则会出现编译时错误。

4 个答案:

答案 0 :(得分:4)

我更想看看Request.Url以确定我在网站结构中的位置,它会给你浏览器请求的网址。

另一种方法是确保您网站页面上的所有链接都是相对链接,从而无需以编程方式更改链接。

答案 1 :(得分:1)

如果所有页面都在同一名称空间中,并且名称空间正确反映了文件夹结构,则可以通过操作名称空间字符串来确定给定页面的相对URL。如果有任何页面不遵循该模式,则可以根据具体情况进行处理。执行此操作的一个选项是使所有页面都从包含RelativeUrl属性的基类继承,该属性可以为单个页面重写。

private const string PAGES_PREFIX = "Web.Pages";
public string ResolveUrl<T>() where T : Page
{
    string pagePath = typeof(T).FullName;
    if (pagePath.StartsWith(PAGES_PREFIX))
    {
        return string.Format("~/Pages/{0}.aspx", pagePath.Substring(PAGES_PREFIX.Length).Replace('.', '/'));
    }
    Debug.Fail(string.Format("Unable to resolve url for {0}", pagePath));
    return null;
}

需要修改此解决方案以匹配您的命名空间,但希望您明白这一点。

答案 2 :(得分:0)

这意味着您想要在打开它之前或之前知道页面URL,我相信这是不可能的,因为您可能会想到。

您需要构建自己的URL字符串,因为页面类将如何知道其页面将打开的位置,例如:

http://localhost/Page1.aspx

http://website/Page1.aspx

此外,您可以将页面及其类移动到另一个文件夹。

因此,您可以通过在类中包含常量变量包含其URL,构建您自己的页面URL,或者等到页面加载来获取其类的页面URL,然后您可以通过其他方式获取它:{{ 1}}

答案 3 :(得分:-1)

可能有多个ASPX从单个类继承,但很少使用。

这样做的副作用是除了标记中的Page标签中的inherits属性之外,类和标记之间没有关联,所以不,你找不到类中的url。您可以通过向页面类添加自定义属性来解决问题,例如:

[MyUrlAttribute("/somefolder/MyPage.aspx")]
class MyPage : Page
{
}

然后通过反射访问它,或者只是在页面本身上设置静态属性。你可以在应用程序启动时扫描aspx,解析@page标签以获取inherits =“...”值,并将它们保存在表中供以后使用。这个问题有很多潜在的解决方案,但没有像“Page.AspxPath。”这样的属性。

请注意,正如其他人所建议的那样,如果您只是处理正常请求,则可以始终使用Request.Url。但是,如果您在a)没有有效的Request上下文时尝试渲染页面,或者b)想要渲染除基于类请求的aspx之外的其他aspx,则必须执行此操作一些魔力。