【发布时间】:2016-02-20 19:17:00
【问题描述】:
我正在用 angular2 和 MVC5 编写一个单页应用程序。不过,我对这两者都是新手,而且我在路由方面遇到了问题。
我想将 URL 匹配为:
-
/-> 转到我的索引页面,它引导 angular -
/api/{controller}/{id?}-> REST API -
/{*anythingelse}-> 如果那里存在文件,则将其作为静态内容返回;否则,如果角度可以路由它,则有角度路由它;否则返回 404。
第二点很简单,如果我愿意放弃 404 返回,我可以让客户端路由正常工作,但我似乎无法调和这一切。
看来这应该可行:
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "api",
template: "api/{controller}/{id?}");
routes.MapRoute(
name: "spa",
template: "{*anythingelse}",
defaults: new { controller = "Home", action = "Index" });
});
和:
@RouteConfig([
{ path: "/", name: 'Splash', component: SplashView },
{ path: '/accounts/login', name: 'Login', component: LoginView },
{ path: '/accounts/register', name: 'Registration', component: RegistrationView },
{ path: '/home/...', name: 'Home', component: HomeView },
])
但这只是为每个不是静态文件的请求提供 Index.cshtml。
我觉得这一定是一个已解决的问题,但我无法在网上找到任何关于它的信息。如何正确地做到这一点?
我使用“HTML5”样式的路径而不是哈希样式。
【问题讨论】:
-
你的 REST api 使用 WebApi 吗? WebApi 是一个独立于 MVC 的框架,并且有自己独立的路由配置。如果使用 MVC(不是 WebApi),您没有正确配置它 - 您需要提供默认操作
defaults: new { action = "Index" }或 URL 中的操作api/{controller}/{action}/{id?}。 -
另外,您对路线顺序的假设是不可能的。 Angular 在浏览器中运行,因此它会首先路由。否则,它将按照您在服务器端配置它们的确切顺序尝试您配置的路由。一旦请求到达服务器,您就无法再次将控制权交还给 Angular。
-
啊,抱歉。我放下了 MVC5,但实际上是指 ASP.NET 5 上的 MVC6。在 ASP.NET 5 中,WebAPI 和 MVC 路由器已合并。
-
From-Angular 导航应该不是问题,因为我只提供对现有页面的导航,因此不需要 404。我主要关注用户的情况直接输入一个URI。服务器在那里获得了第一次破解,如果它知道客户端将接受哪些 URI,则可以返回 404。也许我可以通过某种方式告诉服务器。
标签: asp.net-core-mvc angular2-routing