2017-07-25 84 views
0

我试图在应用程序启动后更新路由表。我在名为“页面”的MVC区域中执行此操作。该网站为每个客户提供自定义URL:www.mydomain.com/Pages/CompanyName/如何在网站启动后更新区域路线?

当您启动网站时,它可以正常工作。它拿起所有的现有客户网址,你可以浏览到他们:

public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     List<Customer> custs = new CustBLL().getActiveCustomers(); 

     string urlList = string.Join("|", custs.Select(c => c.UrlIdentifier).ToArray()); 

     context.MapRoute(
      "Pages_CUSTURL", // Route name 
      "Pages/{CUSTURL}/{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
      constraints: new { CUSTURL = urlList } 
     ); 


     context.MapRoute(
      "Pages_default", 
      "Pages/{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      constraints: new { controller = new ControllerConstraint() } 
     ); 

    } 

但是,创建一个新的客户时,你不能得到的网址为客户“www.mydomain.com/Pages/NewCompany /“,因为404会发生。

所以我试图添加一个新的函数“UpdateRouteRegistration()”,这是在创建新客户之后调用的。

public static void UpdateRouteRegistration() 
    { 
     RouteCollection routes = RouteTable.Routes; 
     using (routes.GetWriteLock()) 
     { 
      routes.Remove(RouteTable.Routes["Pages_CUSTURL"]); 

      List<Customer> custs = new CustBLL().getActiveCustomers(); 

      string urlList = string.Join("|", custs.Select(c => c.UrlIdentifier).ToArray()); 

      routes.MapRoute(
       "Pages_CUSTURL", // Route name 
       "Pages/{CUSTURL}/{controller}/{action}/{id}", // URL with parameters 
       new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
       constraints: new { CUSTURL = urlList } 
      ); 

     } 
    } 

新功能不起作用。运行时没有错误,但之后我无法导航到任何地方。我收到一个BlankView错误。看来我破坏了路由表。

'/'应用程序中的服务器错误。

未找到'BlankView'或其主人的视图,或者没有视图引擎支持搜索的位置。以下地点搜索:
〜/浏览/首页/ BlankView.aspx
〜/浏览/首页/ BlankView.ascx
〜/查看/共享/ BlankView.aspx
〜/查看/共享/ BlankView.ascx
〜/查看/主页/ BlankView.cshtml
〜/查看/主页/ BlankView.vbhtml
〜/查看/共享/ BlankView.cshtml
〜/查看/共享/ BlankView.vbhtml
〜/ __ MVCSITEMAPPROVIDER/BlankView.ascx

我正在使用MVC 5.2.3。任何帮助深表感谢。

编辑:我想知道我是否需要使用AreaRegistraitionContext。但从这篇文章中,我只能使用反射来访问它? Get Areas associated with an MVC project

回答

1

我得到了这个工作,并希望与任何可能做同样的事情或类似的人分享。我不确定这是否是最好的方式,但我很高兴它的工作原理。

我做了两件事。一,我将AreaRegistrationContext保存到一个静态成员以备后用。二,我没有尝试添加/删除现有的映射。相反,我只是添加了一个新的。

在我的情况下,新客户不会太频繁地添加,所以这个区域不会有太多的映射。

这是我的最后一堂课。

public class PagesAreaRegistration : AreaRegistration 
{ 
    public override string AreaName 
    { 
     get 
     { 
      return "Pages"; 
     } 
    } 

    public static AreaRegistrationContext AreaContext { get; set; } 

    public override void RegisterArea(AreaRegistrationContext context) 
    { 

     context.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     // save context to static for later use 
     AreaContext = context; 

     // get customers 
     List<Customer> custs = new CustBLL().getActiveCustomers(); 

     // get list of domain urls 
     string urlList = string.Join("|", custs.Select(c => c.UrlIdentifier).ToArray()); 

     // map customer URLs 
     context.MapRoute(
      "Pages_CUSTURL", // Route name 
      "Pages/{CUSTURL}/{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
      constraints: new { CUSTURL = urlList } 
     ); 

     // general area mapping 
     context.MapRoute(
      "Pages_default", 
      "Pages/{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      constraints: new { controller = new ControllerConstraint() } 
     ); 

    } 

    public static void UpdateRouteRegistration(string newURLID) 
    { 
     // get context from static member 
     RouteCollection routes = AreaContext.Routes; 

     // get write lock to avoid threading issues 
     using (routes.GetWriteLock()) 
     { 

      // add new company url to route table 
      AreaContext.MapRoute(
       "Pages_CUSTURL_" + newURLID,          // Route name 
       "Pages/{CUSTURL}/{controller}/{action}/{id}",      // URL with parameters 
       new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults 
       constraints: new { CUSTURL = newURLID } 
      ); 

     } 

    } 


} 

祝你好运,如果你试图用MVC区域路由来完成这样的事情!