使用Razor和AngularJs访问查询字符串

时间:2016-06-24 18:44:02

标签: c# angularjs razor url-routing query-string

我正在构建一个庞大的Razor网站,我无法重新构建。我需要在客户端使用AngularJs,当页面加载时,需要在页面呈现之前进行一些服务器端预处理。

我需要通过URL查询字符串将参数传递给C#,我需要在JavaScript端使用相同的参数。目前,如果我使用此网址:

http://localhost:32289/razorPage.cshtml#/?param="1234"

我可以在JavaScript端获得该值,但是当我调用

var queryString = HttpContext.Current.Request.QueryString;

在服务器端,它是空的。另外,如果我使用此URL:

http://localhost:32289/razorPage.cshtml/?param="1234"#/

我可以在服务器端访问查询字符串,但后来JavaScript变得疯狂,好像我不断重新运行我的Angular控制器中的代码。我在Chrome控制台中看到了这个:

Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.

最终出现一个错误,表示已达到最大调用堆栈大小。如果我在Angular控制器中放置console.log(),它会持续记录,直到达到调用堆栈的最大大小。

这是我的razorPage.cshtml

@{
   Page.Title = "OCE Visualizer";
   Page.IsDetailedView = false;
   Page.IsCapacity = false;
   Page.IsEmbedded = false;

   InitProvider.Init();
}

<html>
<!--...AngularJs App lives in here-->
</html>

init方法(填充服务器上的一些数据文件夹以便它们可以提供给Angular)使用查询字符串中的参数,AngularJs应用程序也是如此,它也管理自己的路由。

我对Razor比较陌生,但我对AngularJs很熟悉。我认为部分问题可能是因为.NET管理路由的方式,这可能会搞乱Angular如何做到这一点。我知道thisthis SO答案,但它们适用于MVC应用,其中我的网站包含大量.cshtml页面,没有Controller s或API s。

有没有办法在Angular和Razor C#中访问查询字符串,同时使用“漂亮”的URL维护AngularJs路由?

1 个答案:

答案 0 :(得分:0)

好的我找到了解决方案。如果将来有人遇到这个问题,或者它是一个错误的答案,人们可​​以解决它,我会发布它。

我意识到我的问题中两个网址之间的主要区别是$gitExe = "'$env:programfiles\Git\bin\git.exe' -C '$solutionFolder'" 的位置,它是一个片段标识符(?)。我读到了它here,但我可以提醒一下,该页面已有近20年的历史。无论如何,我发现URL的片段部分没有被发送到服务器,这就是为什么我不能在#之后解析查询字符串服务器端的原因。当查询在#之前时,我不知道为什么JavaScript会吓坏我,但是我愿意相信这是我的代码的问题。

解决方案是在#的两侧传递查询字符串。因此,工作URL如下所示:

#

左边的查询字符串是C#可以访问的内容,右边的查询字符串是AngularJs可以访问的内容。此外,http://localhost:32289/razorPage.cshtml?param="1234"#/?param="1234"之后的任何内容都与普通的AngularJs路由一样,所以我不认为这是相关的。