我发现最简单的方法就是将触发404的请求重定向到客户端。即使设置了
$locationProvider.html5Mode(true)
,也可以通过添加哈希标记来实现。
这个技巧适用于在同一网站上有多个Web应用程序且需要URL完整性约束(例如外部身份验证)的环境。以下是如何逐步操作的步骤。
index.html
正确设置
<base>
元素
<base href="@(Request.ApplicationPath + "/")">
web.config
首先将404重定向到自定义页面,例如“Home/Error”
<system.web>
<customErrors mode="On">
<error statusCode="404" redirect="~/Home/Error" />
</customErrors>
</system.web>
主页控制器
实现一个简单的ActionResult
,用于在客户端路由中“翻译”输入。
public ActionResult Error(string aspxerrorpath) {
return this.Redirect("~/#/" + aspxerrorpath);
}
这是最简单的方法。
有可能(建议?)通过一些改进的逻辑来增强错误函数,使其仅在URL有效时将404重定向到客户端,并在客户端上找不到任何内容时正常触发404。
假设您有这些Angular路由。
.when("/", {
templateUrl: "Base/Home",
controller: "controllerHome"
})
.when("/New", {
templateUrl: "Base/New",
controller: "controllerNew"
})
.when("/Show/:title", {
templateUrl: "Base/Show",
controller: "controllerShow"
})
只有当URL以“/New”或“/Show/”开头时,将其重定向到客户端才有意义。
public ActionResult Error(string aspxerrorpath) {
string clientPath = aspxerrorpath.Substring(Request.ApplicationPath.Length);
string[] validPaths = { "/New", "/Show/" };
foreach (string validPath in validPaths) {
if (clientPath.StartsWith(validPath)) {
return this.Redirect("~/#/" + clientPath);
}
}
return new HttpNotFoundResult();
}
这只是改进逻辑的一个例子,当然每个Web应用程序都有不同的需求。
app/index.html
而不是app/
,以显式触发提供 AngularJS 的页面。在我弄清楚之前,我浪费了两个小时的时间。 :-) - Dexter Legaspi