我将VS SPA模板用作基线:http://visualstudiogallery.msdn.microsoft.com/5af151b2-9ed2-4809-bfe8-27566bfe7d83 我遇到的问题是我的DefaultRouteHandler似乎总是在我的由angular定义的路由之前被调用。例如,我有一个路由/wageagreement/new,但.cshtml文件位于/views/wageagreement/detail中。我的angular路由在app.js中定义如下:
$stateProvider
.state('wageagreement-new', {
url: '/wageagreement/new',
templateUrl: '/views/wageagreement/detail',
controller: 'wageAgreementDetailsCtrl'
})
如果我访问/wageagreement/new页面,我的DefaultRouteHandler(见下文)将首先被命中,文件路径为/wageagreement/new。由于该文件不存在,我会收到404错误。然后我的angular路径似乎启动并且该页面可以从/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;
}
}