我正在构建一个庞大的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如何做到这一点。我知道this和this SO答案,但它们适用于MVC应用,其中我的网站包含大量.cshtml
页面,没有Controller
s或API
s。
有没有办法在Angular和Razor C#中访问查询字符串,同时使用“漂亮”的URL维护AngularJs路由?
答案 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路由一样,所以我不认为这是相关的。