Asp.net 我可以基于类通过编程查找web表单的url吗?

Asp.net 我可以基于类通过编程查找web表单的url吗?,asp.net,Asp.net,如果我在~/Page1.aspx中有一个web表单,它实现了代码隐藏文件中定义的Page1类,那么有没有任何方法可以通过编程根据类型确定URL(~/Page1.asp);差不多 string url = GetUrlOfWebForm(typeof(Page1)); 或者可能来自类的实例 string url = GetUrlOfWebForm(new Page1()); 因此,如果页面被移动/重命名,链接到该页面的任何代码都将被更新,或者如果页面被删除,我会收到编译时错误。我更倾向于查看请

如果我在~/Page1.aspx中有一个web表单,它实现了代码隐藏文件中定义的Page1类,那么有没有任何方法可以通过编程根据类型确定URL(~/Page1.asp);差不多

string url = GetUrlOfWebForm(typeof(Page1));
或者可能来自类的实例

string url = GetUrlOfWebForm(new Page1());

因此,如果页面被移动/重命名,链接到该页面的任何代码都将被更新,或者如果页面被删除,我会收到编译时错误。

我更倾向于查看请求。Url要确定我在网站结构中的位置,它将提供浏览器请求的Url


另一种方法是确保页面上站点的所有链接都是相对链接,这样就无需通过编程更改链接。

我更愿意查看请求。Url要确定我在站点结构中的位置,它将提供浏览器请求的Url


另一种方法是确保您的站点页面上的所有链接都是相对链接,这样就不需要以编程方式更改链接。

这意味着您希望在不打开页面或打开页面之前了解页面URL,我相信这不可能像您所想的那样自动实现

您需要自行构造URL字符串,因为page类将如何知道其页面将在何处打开,例如:

您还可以将页面及其类移动到另一个文件夹


因此,您可以从其类中获取页面URL,方法是在包含其URL的类中放置一个常量变量,自行构造页面URL,或等待页面加载,然后通过另一种方式获取:
Request.URL

,这意味着您希望在不打开或打开页面之前了解页面URL,我相信这并不是像你所想的那样自动实现的

您需要自行构造URL字符串,因为page类将如何知道其页面将在何处打开,例如:

您还可以将页面及其类移动到另一个文件夹


因此,您可以通过在包含其URL的类中放置一个常量变量来从其类中获取页面URL,或者自己构造页面URL,或者等待页面加载,然后通过另一种方式获取:
Request.URL

可以从单个类继承多个aspx,尽管这很少使用

这样做的一个副作用是,除了标记中页面标记中的inherits属性外,类和标记之间没有任何关联,因此,不,您无法从类中找到url。您可以通过向page类添加自定义属性来解决问题,如:

[MyUrlAttribute("/somefolder/MyPage.aspx")]
class MyPage : Page
{
}
然后通过反射访问它,或者只是在页面本身上设置一个静态属性。r您可以在应用程序启动时扫描aspx,解析@page标记以获取inherits=“…”值,并将其保存在表中以供以后使用。这个问题有很多潜在的解决方案,但没有像“Page.AspxPath”这样的属性


请注意,正如其他人所建议的,如果您只是处理一个普通的请求,则始终可以使用Request.Url。然而,如果您试图呈现一个页面,而您a)没有有效的请求上下文,或者b)想要呈现一个aspx,而不是基于类请求的内容,那么您必须做一些魔术。

可以让多个aspx从单个类继承,尽管这很少使用

这样做的一个副作用是,除了标记中页面标记中的inherits属性外,类和标记之间没有任何关联,因此,不,您无法从类中找到url。您可以通过向page类添加自定义属性来解决问题,如:

[MyUrlAttribute("/somefolder/MyPage.aspx")]
class MyPage : Page
{
}
然后通过反射访问它,或者只是在页面本身上设置一个静态属性。r您可以在应用程序启动时扫描aspx,解析@page标记以获取inherits=“…”值,并将其保存在表中以供以后使用。这个问题有很多潜在的解决方案,但没有像“Page.AspxPath”这样的属性


请注意,正如其他人所建议的,如果您只是处理一个普通的请求,则始终可以使用Request.Url。但是,如果您试图在以下情况下呈现页面:a)没有有效的请求上下文,或b)希望呈现基于类请求之外的aspx,则必须执行一些操作。

如果您的所有页面都位于同一命名空间中,且命名空间正确反映了文件夹结构,可以通过操纵名称空间字符串来确定给定页面的相对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;
}
private const string PAGES\u PREFIX=“Web.PAGES”;
公共字符串ResolveUrl(),其中T:Page
{
字符串pagePath=typeof(T).FullName;
if(pagePath.StartsWith(PAGES_前缀))
{
返回string.Format(“~/Pages/{0}.aspx”,pagePath.Substring(Pages_PREFIX.Length).Replace('.','/');
}
Debug.Fail(string.Format(“无法解析{0}的url”,pagePath));
返回null;
}

需要修改此解决方案以匹配您的名称空间,但希望您能理解。

如果您的所有页面都在同一名称空间中,并且名称空间正确反映了文件夹结构,则可以通过操纵名称空间字符串来确定给定页面的相对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;
}
private const string PAGES\u PREFIX=“Web.PAGES”;
公共字符串ResolveUrl(),其中T:Page
{
字符串页