或者,如果出于某种原因这是不可能的,那么一个更简单的问题是:如何从布局页面获取当前文件的物理目录?
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
属性?
答案 0 :(得分:0)
所以,经过很多很多小时,我已经弄明白了。
不,您无法禁用ASP.Net WebPages的自动URL路由 - 它已经被WebPageRoute
类烘焙。禁用它的唯一方法是完全禁用WebPages。
有两种方法可以从子布局访问父.cshtml文件的VirtualPath
。
<强> 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