asp.net-mvc - 具有 HTML5 模式和 ASP.Net MVC 的 AngularJS 可选 URL 参数

标签 asp.net-mvc html routing angularjs

与我问的上一个问题类似,但稍微复杂一些。

我有一个 ASP.Net MVC 服务的 Angular 应用。

.when("/Catalog",
{
    templateUrl: "/htm/catalog/catalog.htm"
})
.when("/Catalog/:Category1",
{
    templateUrl: "/htm/catalog/search.htm"
})
.when("/Catalog/:Category1/:Category2",
{
    templateUrl: "/htm/catalog/search.htm"
})
.when("/Catalog/:Category1/:Category2/:Category3",
{
    templateUrl: "/htm/catalog/search.htm"
})
.when("/Catalog/:Category1/:Category2/:Category3/:Category4",
{
    templateUrl: "/htm/catalog/search.htm"
});

$locationProvider.html5Mode(true);

MVC 路由看起来像这样:

// AngularJS Route. This is what allows angular to handle its own routing.
routes.MapRoute(
    "hash",
    "#/{whatever}/{param}/{param2}/{param3}/{param4}/{param5}",
    new
    {
        controller = "Home",
        action = "Index",
        param = UrlParameter.Optional,
        param2 = UrlParameter.Optional,
        param3 = UrlParameter.Optional,
        param4 = UrlParameter.Optional,
        param5 = UrlParameter.Optional
    }
);

// This catches all of the other requests (e.g. /img/logo.jpg);
routes.MapRoute(
    "whatever",
    "{whatever}/{param}",
    new
    {
        controller = "Home",
        action = "Index",
        param = UrlParameter.Optional,
        param2 = UrlParameter.Optional,
        param3 = UrlParameter.Optional,
        param4 = UrlParameter.Optional,
        param5 = UrlParameter.Optional
    }
);

home/index 操作只返回我的索引页:

public void Index()
{
    String html = System.IO.File.ReadAllText(HttpContext.Server.MapPath("~/htm/index.htm"));
    HttpContext.Response.Write(html);
}

我遇到的问题是,当我尝试使用可选参数访问这些路由之一时,页面挂起,出现此 javascript 错误:

错误:达到 10 次 $digest() 迭代。中止!

有时它会无休止地渲染自己(就像镜子照镜子),这让我觉得“whatever”路线有问题。如果没有这些可选参数,路由将完全失败。这样页面确实呈现并且参数被加载到 $routeParams 中,但是页面挂起,大概是因为它递归地呈现自己。

如果我在“任何”MVC 路由上取出可选参数并尝试使用散列符号 (/#/Catalog/test) 访问路由,它加载得很好(它不会挂起并且路由参数有),但是 html5 版本(/Catalog/test)找不到 MVC 路由。

很明显我的问题出在我的路由上,但我不确定我做错了什么。有人可以阐明问题可能是什么吗?

最佳答案

不确定它是否有帮助。但是要记住几件事。

  • $locationProvider.html5Mode(true); 哈希将仅由旧版浏览器使用 (IE <= 9)
  • url 的散列部分将不会发送到服务器。所以你不需要哈希的routes.MapRoute
  • 当浏览器请求 URI(即/Catalog/test)时,它将首先访问 ASP.NET 路由,然后,当页面加载时,它将由 AngularJS< 处理/强>
  • 它也看起来像 routes.MapRoute 处理程序“随便”再次发送整个页面,这意味着当 angular 尝试处理路由并尝试加载 /htm/catalog/search .htm ASP.NET 路由将再次提供页面。这将导致无限循环,因为 angular.js 加载的页面包含其自身,并且它将尝试再次加载它。

希望对您有所帮助。

关于asp.net-mvc - 具有 HTML5 模式和 ASP.Net MVC 的 AngularJS 可选 URL 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15815980/

相关文章:

javascript - 无法附加 Div

php - php页面出现未定义索引的警告,如何去除?

ios - iOS Multipeer Connectivity 是否提供路由层?

javascript - 将元素添加到标题 Kendo UI Tabstrip

asp.net-mvc - Css 和脚本在用户登录网站之前不起作用 - Asp.NET MVC 3 网站

ruby-on-rails - 奇怪的 Rails 路由行为 : two ids swapped around in nested resources

c# - Mvc Asp 排序项目

asp.net - MVC 3 中的 URL 路由

c# - 对话框模式在 asp.net core mvc 5 中不起作用

asp.net - 路由中的自定义包罗万象参数