【发布时间】:2015-04-02 23:18:56
【问题描述】:
我一直在做很多关于在 MVC 上使用 AngularJS 实现 SPA 的研究,但我认为我遗漏了一些东西。我是否仍然需要为每个 View 使用 MVC 控制器,或者 Angular 是否应该能够在没有 MVC 控制器的情况下抓取 cshtml 或 html 文件以在初始页面上呈现?
基本上我有
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
返回我的索引页面,它只是
<div data-ng-view></div>
它还加载了一个带有索引页面的布局,该页面上有我的菜单以及所有链接以及所有脚本文件。当我点击如下链接时:
<a href="/Home/ChangeLog">Change Log</a>
其中包含
<h2>{{Changes.Title}}</h2>
<div>{{Changes.Version}}</div>
它无法加载任何内容,因为它正在尝试访问 MVC 控制器。如果我有一个返回局部视图的 MVC 控制器,它只会将局部视图作为整个页面加载返回。我的角度应用文件是这样的:
var myApp= angular.module("myApp.WebConsole", ['ngRoute']);
myApp.controller("IndexController", IndexController);
var configFunction = function ($routeProvider, $locationProvider, $httpProvider) {
$routeProvider.when("/Home/Index",
{
templateUrl: "Home/Index.cshtml",
controller: IndexController
});
$routeProvider.when("/Home/ChangeLog",
{
templateUrl: "Home/ChangeLog.cshtml",
controller: IndexController
});
$locationProvider.html5Mode(true);
}
configFunction.$inject = ["$routeProvider", "$locationProvider", "$httpProvider"];
myApp.config(configFunction);
而indexcontroller.js文件是:
var IndexController = function ($scope) {
$scope.Heading = "Index Page";
$scope.Changes = {
Title: "Changes",
Version: "1.0"
};
}
IndexController.$inject = ['$scope'];
js 文件位于单独的文件夹中。视图位于标准 MVC 文件夹结构中。
我对它的工作原理有什么遗漏?我希望单击该链接将检索 cshtml 文件,甚至只是一个 html 文件,并在 div 中呈现带有 data-ng-view 标签的 html。我是否应该不使用 Razor 视图(可能是问题的一部分,因为我希望 MVC 控制器需要渲染代码数据,如果有的话)?虽然如果我只使用 html,我仍然会遇到同样的问题,即找不到页面。
编辑2:好的,所以我已经部分弄清楚了,问题在于使用
$locationProvider.html5Mode(true);
没有这个,如果我在菜单上创建链接
<a href="/#/Home/ChangeLog">Change Log</a>
然后一切似乎都正常。我相信这也是使用 Angular 的链接的预期格式。在启用 html5Mode 的情况下制作 MVC 和 Angular 路由有什么魔力吗?
【问题讨论】:
-
仅供参考:我总是将所有 AngularJS 的东西(脚本 + htmls)放到一个文件夹中,比如 /app,然后在该文件夹上执行 IgnoreRoute。我不想通过启动 ASP.NET MVC 并返回部分视图来为 Angular 提供一些 HTML。
标签: c# asp.net-mvc angularjs asp.net-mvc-routing