【问题标题】:AngularJs Routing, MVC6/vNext/.NET5 and MVC ViewAngularJs 路由、MVC6/vNext/.NET5 和 MVC 视图
【发布时间】:2015-10-15 08:23:31
【问题描述】:

在 MVC6/vNext/.NET5 中使用 AngularJs 的所有示例都使用 wwwroot 中的静态 index.html 文件。完成了,但我现在需要加载 MVC index.cshtml 页面,以便我可以将 config.json 中的设置注入页面。

我想要的只是一个默认页面(主页),无论请求什么 url,只要 url 不是 js/css 文件或 api 控制器,它都会加载。

我已经尝试将它添加到我的Configure(IApplicationBuilder app, IServiceProvider serviceProvider) 方法中,但是现在,我的 js 和 css 文件都拉回了 Home/Index.cshtml 文件

app.UseMvc(options =>
{
    options.MapRoute("Api",
        template: "api/{version}/{controller}/{action?}",
        defaults: new { version = "v1", controller = "Page" });

    options.MapRoute(
        name: "default",
        template: "{*url}",
        defaults: new { controller = "Home", action = "Index" });
});

我的应用程序加载到默认地址http://localhost:port,没有额外的文件夹可以开始。通过angularJs,用户可以访问诸如

之类的url
http://localhost:6000/page
http://localhost:6000/page/9
http://localhost:6000/another
http://localhost:6000/another/9/sub

所有这些都应该加载 Home/Index.cshtml 页面,并让 Angular 接管路由。

我看到了向 web.config 文件添加内容的选项,但我不会使用 IIS,所以这不是一个选项

编辑 如果我更新我的路线,它似乎会加载页面和所有 js/css 文件,这很棒。但是,如果我尝试直接进入有角度的路线,则不会加载任何内容。

app.UseMvc(options =>
{
    options.MapRoute("Api",
        template: "api/{version}/{controller}/{action?}",
        defaults: new { version = "v1", controller = "Page" });

    options.MapRoute(
        name: "default",
        template: "{controller}/{action?}",
        defaults: new { controller = "Home", action = "Index" });
});

编辑 2

public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
{
    // add automapper registrations
    app.RegisterMappingFiles();

    // Enable all static file middleware
    app.UseStaticFiles();

    // Enable Mvc for controllers
    app.UseMvc(options =>
    {
        options.MapRoute(
            name: "default",
            template: "{controller}/{action?}",
            defaults: new { controller = "Home", action = "Index" });
    });

}

【问题讨论】:

  • 你确定所有的 URL 都应该映射到 MVC 中的主页吗?也许只映射一个控制器/动作会更好。任何其他 URL 都应该通过 HTTP 响应重定向到操作的正确 URL?
  • 我只希望用户能够加载一个角度路由,例如 /pages/9 并且它将加载 Home/index.cshtml 页面,然后 Angular 将在客户端上加载正确的路由

标签: c# asp.net asp.net-mvc asp.net-core


【解决方案1】:

我认为,您没有在请求管道中添加使用静态文件,因此对它们进行请求,处理 MVC 路由:

    public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
    {
        app.UseStaticFiles();

        app.UseMvc(options =>
        {
            options.MapRoute("Api",
        template: "api/{version}/{controller}/{action?}",
        defaults: new { version = "v1", controller = "Page" });

            options.MapRoute(
                name: "default",
                template: "{*url}",
                defaults: new { controller = "Home", action = "Index" });
        });

    }

您的调用 app.UseStaticFiles() 必须位于调用 app.UseMvc() 之前,因为调用按注册顺序执行的中间件,所以对静态文件的请求不会到达路由中间件。

Documentaion on docs.asp.net

【讨论】:

  • 这适用于初始加载,但如果我导航到像 http://localhost/pages/9 这样的客户端路由,则没有任何效果,我会收到 404 错误
  • 你用过“{*url}”路由模板吗?我使用了(在我的示例中)错误的模板(“{controller}/{action?}”)
  • 您的调用 app.UseStaticFiles() 是否位于调用 app.UseMvc() 之前?它必须位于之前,对静态文件的请求没有到达路由中间件。
  • template: "{controller}/{action?}", - 使用路由模板template: "{*url}", 也消耗像http://localhost/pages/9 这样的请求。
  • 另外,我必须在页面的 中添加
猜你喜欢
  • 1970-01-01
  • 2015-03-12
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
相关资源
最近更新 更多