AngularJS使用mvc在spa模型中路由无限循环

时间:2014-06-17 03:06:07

标签: javascript asp.net-mvc angularjs asp.net-mvc-4 single-page-application

我在网上试了很多其他帖子似乎与我的问题一样,但都没有用。

我有这个菜单:

<ul class="nav navbar-nav">
    <li class="active"><a href="#Painel/1">Novas</a></li>
    <li><a href="#Painel/2">Todas</a></li>
    <li><a href="#Painel/3">Finalizadas</a></li>
    <li><a href="#Painel/4">Pendentes</a></li>
</ul>

非常简单的导航栏。此路由设置:

module.config(["$routeProvider", "$locationProvider", function($routeProvider, $locationProvider)
{
    //$locationProvider.html5Mode(true);

    $routeProvider
        .when('/Painel/:painelId/', 
        {
            templateUrl : function(params)
            {
                return "/Painel/Index/" + params.painelId;
            },
            controller  : 'painelController'
        })
        .otherwise(
        {
            redirectTo: "/Painel"
        });
    }]);
}

我的MVC控制器:

public class PainelController : Controller
{
    public ActionResult Index(int? id))
    {
        return View();
    }
}

最后我的角度控制器:

module.controller('painelController', ["$scope", "$routeParams", function ($scope, $routeParams)
{
    debugger;
}]);

它是一个非常简单的架构,但是角度无限地循环通过它的控制器。我小心翼翼地将templateUrl亲戚与/设置为那里建议的帖子,但是没有用。它可以将参数发送到mvc Action,但是它会在angular的控制器debugger上开始循环停止。

我该怎么办?

2 个答案:

答案 0 :(得分:1)

你的问题是:painelId不是可选的,因此你无限地落入你的otherwise()重定向。使:painelId可选,如

'/Painel/:painelId?/'

这应该可以解决您的问题。如果您没有使用支持可选参数的Angular版本,那么您需要添加另一个when()来覆盖&#39; / Painel&#39;路由。

答案 1 :(得分:0)

主要问题不在于Angular代码,而是在MVC的返回操作中:

return View();

由于您正在处理动态内容,因此您不必返回完整的html源代码(包含htmlheadbody代码... ),所以我不得不改为:

return PartialView();

更有意义的是什么。因为每个请求都在调用一个新的角度代码,这会打开一个新的请求等等......然后我为opitional参数创建了两条路径(我不知道为什么它没有像@ Tacoman667一样工作尖)