Asp.net mvc ASP.NET MVC和AngularJS路由

Asp.net mvc ASP.NET MVC和AngularJS路由,asp.net-mvc,angularjs,asp.net-mvc-routing,angularjs-routing,Asp.net Mvc,Angularjs,Asp.net Mvc Routing,Angularjs Routing,我在ASP.NET MVC应用程序中使用AngularJS,但嵌套路由有问题。我使用ASP.NET MVC路由,但在SPA中我使用的是UI路由器 我的Home/Index是我的AngularJS应用程序,在Index.cshtml中 我希望我的URL完全由我的AngularJS SPA控制(html5Mode=true) 我在ASP.NET MVC中设置了RouteConfig,如下所示: routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); ro

我在ASP.NET MVC应用程序中使用AngularJS,但嵌套路由有问题。我使用ASP.NET MVC路由,但在SPA中我使用的是UI路由器

我的
Home/Index
是我的AngularJS应用程序,
在Index.cshtml中

我希望我的URL完全由我的AngularJS SPA控制(html5Mode=true)

我在ASP.NET MVC中设置了RouteConfig,如下所示:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    name: "DefaultHome",
    url: "",
    defaults: new { controller = "Home", action = "Index" }
);

routes.MapRoute(
    name: "Default",
    url: "{.*}",
    defaults: new { controller = "Home", action = "Index" }
);
我使用的是UI路由器,但这与此无关,因为这是一个ASP.NET MVC路由问题。然而,AngularJS路由代码如下所示:

app.config(function ($stateProvider, $urlRouterProvider, $locationProvider) {

    $urlRouterProvider.otherwise("/");

    $stateProvider
    .state('home', {
      url: "/",
      templateUrl: "Scripts/app/partials/home.html",
      controller: "HomeController"
    })
    .state('login', {
      url: "/login",
      templateUrl: "Scripts/app/partials/login.html",
      controller: "AccountController"
    })
    .state('login.list', {
      url: "/list",
      templateUrl: "Scripts/app/partials/login.list.html",
      controller: "AccountController"
    });

    $locationProvider.html5Mode(true);

});
当我转到
/
/login
时,这种方法非常有效,但当我转到
/login/list
时,我从ASP.NET MVC应用程序中得到一个404,上面说:

The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
有什么问题?我已经指定了一个
{.*}
规则,因此应该将其定向到AngularJS应用程序。

“这是一个SPA,路由由AngularJS UI路由器控制”-直到实际加载应用程序后才为真

您需要使应用程序从每个可能的途径都可用

我通常做的是在服务器上有这样的结构:

  • 资产/*->忽略路由(将思想传递到文件)
  • api/*->api路由
  • *->index.html/index.cshtml/
下面是一组我常用的按顺序排列的路线的示例

router
.Route("assets/{*ignore}").Through()
.Route("api/search").To<SearchController>()
.Route("api/content/{contentType}/{id}").To<ContentController>(x => x.Set.Defaults(new {id = RouteParameter.Optional}))
.Route("api/file/{contentType}/{id}/{head}").To<FileController>(x => x.Set.Defaults(new {id = RouteParameter.Optional, head = RouteParameter.Optional}))
.Default().To<TController>();
路由器
.Route(“assets/{*ignore}”)。通过()
.路由(“api/搜索”)。到()
.Route(“api/content/{contentType}/{id}”).To(x=>x.Set.Defaults(新的{id=RouteParameter.Optional}))
.Route(“api/file/{contentType}/{id}/{head}”).To(x=>x.Set.Defaults(new{id=RouteParameter.Optional,head=RouteParameter.Optional}))
.Default().To();
(请注意,它们是在围绕WebAPI框架的框架中定义的,因此具有流畅的语法和强类型控制器目标)

如果您在主视图中使用Razor,我通常会:

<base href="@string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~/"))" /> 


设置基本路径。

听起来更像是一个
web.config
问题,因为您希望服务器管理虚拟目录而不是MVC框架,这是什么意思?我希望所有内容都指向控制器主目录和操作索引,以便我的SPA使用嵌套路由。这意味着您希望服务器执行此操作,而不是您的mvc框架是否可以让mvc框架处理此操作?为什么希望框架执行服务器的工作?