То, как мы это делаем, работает хорошо, когда закладывается какая-то почва. Я уверен, что есть несколько способов снять кожу с кошки. (В любом случае, кто скинет кошек. Кошки милые и приятные!)
Во-первых, это будет работать только с веб-проектами, скомпилированными ASP.Net, а не с веб-сайтами.
Каждая страница должна наследоваться от пользовательского абстрактного базового класса, который выглядит примерно так:
public abstract class PageBase : Page
{
private static string _baseUrl = "/";
public static string BaseUrl
{
get { return _baseUrl; }
set { _baseUrl = value; }
}
protected static string BuildUrl(string basePath)
{
if( !string.IsNullOrEmpty(basePath) && basePath.StartsWith("~/"))
{
basePath = basePath.replace("~/", BaseUrl);
}
return basePath;
}
protected static string LoadView(string path)
{
Response.Redirect(path);
}
}
Каждая страница также реализует специфичный для страницы интерфейс. Каждый специфичный для страницы интерфейс также наследуется от базового интерфейса:
public interface IPageBase()
{
void LoadView(string path);
}
Тогда каждая страница определяет свою собственную версию BaseUrl. Возможно, вы захотите учесть строки запросов / шифрование пути / и т. Д.
Наконец, любой из ваших докладчиков (которые должны ссылаться на интерфейсы для конкретной страницы) может получить статический BuildUrl () на нужной странице для просмотра, а затем вызвать LoadView () с возвращенным путем.