如何在ASP.Net WebPages中禁用URL路由?

时间:2014-06-13 17:48:26

标签: razor asp.net-routing asp.net-webpages

或者,如果出于某种原因这是不可能的,那么一个更简单的问题是:如何从布局页面获取当前文件的物理目录?

this.VirtualPath将引用布局文件本身的虚拟路径,this.NormalizePath(".")将仅获取包含布局文件的目录的虚拟路径。

我只是希望有一个网站不会因为某些人无缘无故地键入http://example.com/index/some/other/junk而无法使相关链接无法正常工作。

编辑,告诉你我的意思:

TestLayout.cshtml

<html>
   <head>
      <title>Test Page</title>
   </head>
   <body>
      <div style="background: grey">
         @Request.RawUrl<br />
         @Request.Url.AbsolutePath<br />
         @Request.Url.AbsoluteUri<br />
         @Request.Url.LocalPath<br />
         @Request.CurrentExecutionFilePath<br />
         @Request.FilePath<br />
         @Request.Path<br />
         @VirtualPath<br />
      </div>
      <div style="background: red">
         @RenderBody()
      </div>
   </body>
</html>

Test.cshtml

@{
   Layout = "TestLayout.cshtml";
}
@Request.RawUrl<br />
@Request.Url.AbsolutePath<br />
@Request.Url.AbsoluteUri<br />
@Request.Url.LocalPath<br />
@Request.CurrentExecutionFilePath<br />
@Request.FilePath<br />
@Request.Path<br />
@VirtualPath<br />

如果你转到http://example.com/Test/random/junk/at/the/end,你会发现唯一能正确修剪所有残差的行是两条@VirtualPath行 - 但是,布局页面的VirtualPath属性是TestLayout.cshtml。如何从TestLayout.cshtml中访问Test.cshtml的VirtualPath属性?

1 个答案:

答案 0 :(得分:0)

所以,经过很多很多小时,我已经弄明白了。

不,您无法禁用ASP.Net WebPages的自动URL路由 - 它已经被WebPageRoute类烘焙。禁用它的唯一方法是完全禁用WebPages。

有两种方法可以从子布局访问父.cshtml文件的VirtualPath

  1. 您可以手动解析网址。这是相当复杂的,虽然所有的工作都已经在WebPageRoute.cs文件中完成,所以你可以通过一些调整来解决它。问题是您只能获取最顶层父页面的VirtualPath。
  2. 您可以扩展WebPage类,重写ConfigurePage方法,并存储参数以供以后使用。示例代码如下:
  3. <强> CustomWebPage.cs

    using System.Web;
    using System.Web.WebPages;
    public abstract class CustomWebPage : WebPage
    {
       private WebPageBase _parentPage;
    
       public WebPageBase ParentPage { get; private set; }
    
       protected override void ConfigurePage(WebPageBase parentPage)
       {
          ParentPage = parentPage;
       }
    }
    

    <强> TestLayout.cshtml

    <html>
       <head>
          <title>Test Page</title>
       </head>
       <body>
          <div style="background: grey">
             Inside the layout page!<br/>
             VirtualPath is: @VirtualPath<br />
             Parent's VirtualPath is: @ParentPage.VirtualPath
          </div>
          <div style="background: red">
             @RenderBody()
          </div>
       </body>
    </html>
    

    <强> Test.cshtml

    @{
        Layout = "TestLayout.cshtml";
    }
    Inside the main test page!<br />
    VirtualPath is @VirtualPath
    

    <强>输出:

      

    在布局页面内!

         

    VirtualPath是:〜/ TestLayout.cshtml

         

    Parent的VirtualPath是:〜/ Test.cshtml

         

    在主测试页面内!

         

    VirtualPath是〜/ Test.cshtml