#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];