角度与Razor的观点& .NET MVC5

时间:2018-01-16 09:10:13

标签: asp.net asp.net-mvc angular asp.net-mvc-4

我一直试图在.NET MVC中使用剃刀视图进行路径定位(即没有#'#);并且到目前为止没有运气。

AppComponent

// app component
import { Component} from '@angular/core'

        @Component({
            moduleId: module.id,
            selector: 'app-root',
            templateUrl: '/Harness2.0/Main/app',// -> MVC controller 
            styleUrls: ['app.component.css']
        })

AppHeader TS

// app-header.ts
import { Component } from '@angular/core';

@Component({
    moduleId: module.id,
    selector: 'app-header-demo',
    templateUrl: '/Harness2.0/Component/AppHeader',
})

角度路由模块:

const appRoutes: Routes = [
    { path: 'appheader-test', component: AppHeaderTestComponent },  
    { path: '', redirectTo: '/', pathMatch: 'full' },

];

Index.cshtml

@{
    ViewBag.Title = "Harness 2.0";
}
<!DOCTYPE html>
<html>
<head>
    <base href="./" />
    <title>@ViewBag.Title</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- Load styles -->
    @Styles.Render("~/Content/css")
    @Styles.Render("~/Content/material")
    <!-- Load libraries & Configure SystemJS -->
    @Scripts.Render("~/scripts/ng")
    <script>
        System.import('src').catch(function (err) {
            console.error(err);
        });
    </script>
</head>
<body>
    <app-root>Loading app-root...</app-root>
</body>
</html>

RouteConfig.cs

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, }
            );

routes.MapRoute(
                name: "NotFound",
                url: "{*catchall}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

HomeController.cs

public class HomeController : Controller
    {

        public ActionResult Index()
        {
            return View();
        }
    }

MainController.cs

public class MainController : Controller
    {

        public ActionResult App()
        {
            return View();
        }
    }

ComponentsController.cs

public class ComponentController : Controller
    {

        public ActionResult AppHeader()
        {
            return View();
        }
    }

当应用程序拳头加载URL时,http://localhost/Harness2.0/&amp; MVC rotuer默认为HomeController&amp;在<app-root>存在的地方加载Index.cshtml。当我导航到http://localhost/Harness2.0/app-header时 组件视图已加载&amp;关于浏览器刷新(F5)我得到Not Not 404,这是有意义的,因为整个URL转到服务器&amp;没有与该特定网址相关联的Controller操作。

我尝试过的一个解决方案是 IIS网址重写

<rewrite>
      <rules>
        <rule name="Rewrite URL" stopProcessing="true">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="./" />
        </rule>
      </rules>
    </rewrite>

这会在刷新时呈现索引,但它不是引导AppModule而是直接进入app.component.ts,我在构造函数中有一些控制台日志,它们无限运行,直到调用堆栈大小超过。

非常感谢任何帮助。

P.S:

我通过在RouterModule&amp;中使用useHash属性尝试了哈希定位策略。一切正常。但是我已经将它与PathLocation一起使用了,到目前为止我还没有。我也没有使用.NET Core。

其他相关链接:

  1. http://knightcodes.com/angular2/2017/01/04/angular-2-routes-with-asp-net-mvc.html
  2. ASP.NET 5 + Angular 2 routing (template page not REloading)

2 个答案:

答案 0 :(得分:1)

Kal93,如果你使用角度,你不需要使用routerConfig.cs。你的页面总是一样的(index.cshtml)。例如在我的.NET Core 2.0中我有

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");

        routes.MapSpaFallbackRoute(
            name: "spa-fallback",
            defaults: new { controller = "Home", action = "Index" });
    });

Angular是谁管理路由器

答案 1 :(得分:0)

我也尝试过与Eliseo不同的方式。这是我Configure类的Startup方法。

Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.Use(async (context, next) => {
                await next();
                if (context.Response.StatusCode == 404 &&
                    !Path.HasExtension(context.Request.Path.Value) &&
                    !context.Request.Path.Value.StartsWith("/api/"))
                {
                    context.Request.Path = "/index.html";
                    await next();
                }
            });

            app.UseMvcWithDefaultRoute();

            app.UseDefaultFiles();
            app.UseStaticFiles();
        }

launchSettings.json

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:49600/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "AngularCoreDemo": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:5000/"
    }
  }
}

您还必须添加一个代理类,以便/ api请求被路由到localhost:5000(.net核心应用程序),其他请求被路由到localhost:4200(角度应用程序)。

proxy.config.json

{
  "/api": {
    "target": "http://localhost:5000",
    "secure":  false
  }
}

您需要构建角度应用程序,以便静态文件位于wwwroot文件夹中,并且需要从命令行启动服务器,并将代理文件作为参数(请查看确切的语法)。