向window.location.href传参失败,Razor取Azure AD用户值报错如何解决?
问题原因
两个报错都是Razor服务端渲染和客户端JS语法不匹配导致的:
- 触发
SyntaxError是因为@User.Identity.Name是服务端变量,渲染到前端时会直接输出对应的邮箱字符串,你没有给它加引号,渲染后的JS代码会变成var loggedUser = xxx@domain.com;,JS会把邮箱字符串当成未定义的变量解析,自然报语法错误。 - 触发
ReferenceError是因为去掉@之后,Razor不会再处理这段代码,服务端不会把它替换成实际的用户名,JS直接把User当成客户端变量查找,客户端根本没有这个变量,所以报未定义。
你之前在其他场景用同样方式传参正常,是因为那些场景你是直接把变量用在服务端渲染的Url.Action参数、HTML属性等位置,属于服务端直接处理的逻辑,不需要适配JS语法,所以不会出问题,本次是把服务端变量注入到客户端JS代码中,必须符合JS的语法规则。
解决方法
1. 快速修复
给Razor输出的内容套上引号,符合JS字符串的语法要求:
// 修改前 var loggedUser = @User.Identity.Name; // 修改后 var loggedUser = "@User.Identity.Name";
2. 兼容性更强的修复
如果用户名包含引号、特殊符号,直接套引号还是可能触发语法错误,推荐用JSON序列化的方式输出,自动处理转义和引号:
var loggedUser = @Json.Serialize(User.Identity.Name);
ASP.NET Core 自带的Json.Serialize会自动把字符串处理成合法的JS字符串格式,不需要手动加引号,兼容性更好。
3. 可选优化
把参数拼接到URL之前最好做一次URL编码,避免特殊字符破坏参数结构:
window.location.href = url + "?custEmail=" + encodeURIComponent(loggedUser);
内容的提问来源于stack exchange,提问作者user4912134
相关产品推荐
相关产品推荐

