Как я могу найти имя (файла) текущей страницы в ASP.NET ?

#c# #asp.net

#c# #asp.net

Вопрос:

Как я могу найти имя (default.aspx) текущей страницы или веб-элемента управления в коде за ней?

Я хочу написать суперкласс, который использует это имя.

Ответ №1:

Вы имеете в виду, что хотите найти исходное имя файла объекта, который выполняется в данный момент? Т.е. изнутри элемента управления MyControl, который вы хотите получить MyControlOnDisk.ascx ? Как правило, эта информация теряется при компиляции, и, более того, многие страницы и элементы управления построены на частичных классах, а имена файлов, из которых они взяты, скомпилированы в единую сборку.

Для страницы вы можете использовать следующее, но только если страница не перенаправлена внутренне, не создана как класс с другой страницы, это не главная страница, и вы не находитесь внутри статического метода:

 string currentPageFileName = new FileInfo(this.Request.Url.LocalPath).Name;
  

В случае элемента управления, насколько я знаю, это обычно невозможно (он скомпилирован), но, возможно, кто-нибудь сможет пролить некоторый свет на это.

«я хочу написать суперкласс, который использует это имя «

Я полагаю, вы имеете в виду написать подкласс? Если вы пишете суперкласс, вы просто создаете виртуальный метод и реализуете его в своем подклассе (страница). Если вы хотите создать подкласс, вы можете взять имя класса страницы, которое выглядит следующим образом:

 // current page
public partial class MyLovelyPage : System.Web.UI.UserControl
  

и использовать его следующим образом для вывода из него:

 public partial class NewDerivedPage : MyLovelyPage
  

Комментарии:

1. Можете ли вы привести мне пример, когда это теряется при компиляции? Из-за того, что что-то должно перенаправляться к этому обработчику, по моему опыту, обычно это не тот случай.

2. @Nick: примером может быть любая страница. После компиляции сопоставление между страницей и классом выполняется внутри *.aspx файла, который считывается обработчиком ASPX. Сам скомпилированный класс (который находится в каталоге bin) не будет содержать никакой информации об этом. На самом деле, вы можете изменить имя пути и не изменять имя класса, независимо от того, что вы считаете нужным, и сделать это во время выполнения. Единственная информация, которая остается, находится в RuntimeCompatibilityAttribute , в котором хранится имя физической сборки (которое частично содержит имя исходного файла, в зависимости от метода компиляции).

3. @Nick: перефразировано по-другому: начнем с того, что этой информации вообще нет в классе. Сопоставление выполняется вне класса в текстовом файле (ASPX-файле, web.config или другим способом), и страница не знает, как она использовалась или настроена в Visual Studio (и может быть повторно использована с другими страницами).

4. @Abel — Я думаю, мы говорим о разных вещах… вы, кажется, пытаетесь получить имя выполняющегося класса, и в этом случае да, это не очень прямолинейно … нам нужно лучшее определение «current», а не .aspx имя файла, которое довольно прямолинейно из запроса и / или маршрутизации. Перечитывая ваш ответ и вопрос, вы, вероятно, правы, первая и вторая строка вопроса действительно не сочетаются, похоже, он после класса-обработчика, а не страницы, моя ошибка 🙂

5. @Nick: Я согласен, вторая строка вопроса, похоже, не соответствует первой строке. Было бы неплохо, если @MHF прольет на это некоторый свет…

Ответ №2:

Я бы порекомендовал альтернативный:

 Server.MapPath(Page.AppRelativeVirtualPath)
  

Это работает с ASP.Net чтобы получить полный путь и имя файла для текущей страницы.

Ответ №3:

 Request.ServerVariables["SCRIPT_NAME"]
  

Ответ №4:

если вы не используете маршрутизацию :

 string sPath = HttpContext.Current.Request.Url.AbsolutePath;
        string[] strarry = sPath.Split('/');
        int lengh = strarry.Length;
        string sRet = strarry[lengh - 1];