Установка MasterPageFile в Global.asax нарушает маршрутизацию страницы URL

#c# #asp.net #url-routing #master-pages

#c# #asp.net #url-маршрутизация #мастер-страницы

Вопрос:

Я использую Global.asax файл для переопределения Page_PreInit события для установки MasterPageFile , я также использую Page Routing .

Кажется, что когда я устанавливаю MasterPageFile , он нарушает PageRouting и вызывает 404 для каждого URL.

 void Application_PreRequestHandlerExecute(object src, EventArgs e)
{
    Page p = this.Context.Handler as Page;
    if (p != null) {
        p.PreInit  = new EventHandler(Page_PreInit);
    }
}

void Page_PreInit(object sender, EventArgs e)
{
    Page p = this.Context.Handler as Page;
    if (p != null) {
        if (HttpContext.Current.Session["Branding-UseCustomMasterPage"] != null amp;amp; HttpContext.Current.Session["Branding-CustomMasterPageName"] != null) {
            if (Boolean.Parse(HttpContext.Current.Session["Branding-UseCustomMasterPage"].ToString())) {
                if (Request.UserAgent.Contains("Valve Steam GameOverlay")) {
                    p.MasterPageFile = "~/APIMasterPages/"   HttpContext.Current.Session["Branding-CustomMasterPageName"].ToString()   "-SteamOverlay.master";
                }
                else {
                    p.MasterPageFile = "~/APIMasterPages/"   HttpContext.Current.Session["Branding-CustomMasterPageName"].ToString()   ".master";
                }
            }
        }
        else {
            if (Request.UserAgent.Contains("Valve Steam GameOverlay")) {
                p.MasterPageFile = "~/APIMasterPages/SteamOverlay.master";
            }
        }
    }
}
  

И код, используемый для установки PageRoutes :

 protected void Application_Start(object sender, EventArgs e)
{
    RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.Ignore("");

    routes.MapPageRoute("api-initiate", "api-initiate/{apiKey}/", "~/Corporate/APIInitiate.aspx");

    routes.MapPageRoute("404", "{*url}", "~/Page-Not-Found.aspx");
}
  

Ответ №1:

Все ли объекты, которые вы пытаетесь извлечь из сеанса, случайно равны нулю, и вы нажимаете только регистр else{} в вашем Page_PreInit()?

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

1. Да, но даже тогда он все равно будет «p.MasterPageFile = «~/APIMasterPages/SteamOverlay.master»;». Который работает нормально. Но при принудительном использовании новой главной страницы с помощью этого метода, похоже, нарушается вся маршрутизация страницы..

Ответ №2:

Выяснил, в чем проблема; на Page_Load я взаимодействовал с MasterPage как таковой;

 SiteMaster m = Master as SiteMaster;
  

Однако, когда я изменил MasterPage это, в свою очередь, вызывало ошибку; и PageRoute отправлял сообщение об ошибке 404.

Исправление заключалось в использовании фактического класса, который я наследую в классах MasterPage.

 Custom.CustomMasterPage m = Master as Custom.CustomMasterPage;
  

Определение класса MasterPage:

 public partial class SiteMaster : Custom.CustomMasterPage
{ 
    // Master page class   
}