这是一个关于AngularJS应用程序路由的问题.它没有使用MVC,它确实使用WebAPI作为后端(这些路由工作正常).
我使用VS SPA模板作为基线:http://visualstudiogallery.msdn.microsoft.com/5af151b2-9ed2-4809-bfe8-27566bfe7d83
我遇到的问题是我的DefaultRouteHandler似乎总是在我的角度定义路线之前被击中.例如,我有一个/ wageagreement/new的路由,但.cshtml文件位于/ views/wageagreement/detail中.我的角度路线在app.js中定义如下:
$stateProvider
.state('wageagreement-new', {
url: '/wageagreement/new',
templateUrl: '/views/wageagreement/detail',
controller: 'wageAgreementDetailsCtrl'
})
Run Code Online (Sandbox Code Playgroud)
如果我转到页面/ wageagreement/new,我的DefaultRouteHandler(见下文)首先被命中,文件路径是/ wageagreement/new.由于此文件不存在,我收到404错误.然后,我的角度路径似乎开始,页面从/ view/wageagreement/detail加载得很好.因此,对于每个页面,我得到错误404闪烁然后我得到正确的页面.有没有办法让这项工作?我开始认为我的.cshtml文件可能必须与我的路线相匹配才能使其正常工作.
public class DefaultRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
// Use cases:
// ~/ -> ~/views/index.cshtml
// ~/about -> ~/views/about.cshtml or ~/views/about/index.cshtml
// ~/views/about -> ~/views/about.cshtml
// ~/xxx -> ~/views/404.cshtml
var filePath = requestContext.HttpContext.Request.AppRelativeCurrentExecutionFilePath;
if (filePath == "~/")
{
filePath = "~/views/touranalysis/index.cshtml";
}
else
{
if (!filePath.StartsWith("~/views/", StringComparison.OrdinalIgnoreCase))
{
filePath = filePath.Insert(2, "views/");
}
if (!filePath.EndsWith(".cshtml", StringComparison.OrdinalIgnoreCase))
{
filePath = filePath += ".cshtml";
}
}
var handler = WebPageHttpHandler.CreateFromVirtualPath(filePath); // returns NULL if .cshtml file wasn't found
if (handler == null)
{
requestContext.RouteData.DataTokens.Add("templateUrl", "/views/404");
handler = WebPageHttpHandler.CreateFromVirtualPath("~/views/404.cshtml");
}
else
{
requestContext.RouteData.DataTokens.Add("templateUrl", filePath.Substring(1, filePath.Length - 8));
}
return handler;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 8
VS SPA模板(http://visualstudiogallery.msdn.microsoft.com/5af151b2-9ed2-4809-bfe8-27566bfe7d83)正在进行双重路由.这还不够.这是错的.除了根链接之外,非直接链接不起作用.
如果你想使用Angular路由,你所要做的就是使DefaultRouteHandler类看起来像这样
public class DefaultRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return WebPageHttpHandler.CreateFromVirtualPath("~/views/index.cshtml");
}
}
Run Code Online (Sandbox Code Playgroud)
Basicaly重新路由到Angular主页,让Angular路由完成工作.
| 归档时间: |
|
| 查看次数: |
1489 次 |
| 最近记录: |