Sitefinity项目中获取并显示用户邮箱失败的问题求助
我们正在维护一个老版Sitefinity项目,需要把登录用户的邮箱显示在页面的一个div里,看起来是个简单需求,但实际刷新页面后,div里显示的是<%= UserEmail %>而不是真实的邮箱地址。我们怀疑是服务器端代码的问题,但查了文档也没找到解决办法,求各位大佬指点!
我们目前的实现代码如下:
现有代码实现
Master页面(客户端)
这里引入了JS文件,还有用来显示邮箱的div:
<head runat="server"> <title></title> <!-- Include your other head content --> <script src="~/Scripts/userEmailScript.js" type="text/javascript"></script> </head> <body> <form id="form1" runat="server"> <!-- Your HTML content --> <div class="col-md-12"> <div id="userEmailDiv"></div> </div> </form>
外部JS文件
document.addEventListener("DOMContentLoaded", function() { var userEmail = "<%= UserEmail %>"; var userEmailElement = document.getElementById("userEmailDiv"); if (userEmailElement) { userEmailElement.innerText = userEmail; } });
服务器端.cs页面
using System; using Telerik.Sitefinity.Security; using Telerik.Sitefinity.Security.Model; namespace YourNamespace { public partial class YourPage : System.Web.UI.Page { protected string UserEmail { get; set; } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // Your server-side C# code here // For example, fetching user email UserManager userManager = UserManager.GetManager(); SitefinityProfile profile = userManager.GetUserProfile(); // Assuming the user is logged in UserEmail = profile.Email; } } } }
问题原因分析
你遇到的核心问题是外部JS文件中的ASP.NET内嵌表达式<%= UserEmail %>不会被服务器解析。因为服务器只会处理.aspx、.master这类动态页面文件里的服务器端标记,而外部.js文件是作为静态资源直接发送给浏览器的,服务器不会对它做任何解析,所以浏览器拿到的就是字符串<%= UserEmail %>,而不是实际的邮箱值。
当然也可以顺便检查下服务器端的代码逻辑,原来的userManager.GetUserProfile()调用可能存在问题——在Sitefinity中,这个方法如果不指定用户对象,可能无法正确获取当前登录用户的Profile,这点后面也会提到。
解决方案
方案一:把JS代码嵌入到Master页面中
既然外部JS无法解析服务器标记,那直接把JS代码放到Master页面的<script>标签里,这样服务器就会解析<%= UserEmail %>了:
修改Master页面,去掉外部JS引用,添加内嵌脚本:
<head runat="server"> <title></title> <!-- Include your other head content --> </head> <body> <form id="form1" runat="server"> <!-- Your HTML content --> <div class="col-md-12"> <div id="userEmailDiv"></div> </div> <script type="text/javascript"> document.addEventListener("DOMContentLoaded", function() { var userEmail = "<%= UserEmail %>"; var userEmailElement = document.getElementById("userEmailDiv"); if (userEmailElement) { userEmailElement.innerText = userEmail; } }); </script> </form> </body>
方案二:用隐藏字段传递邮箱值
如果想保留外部JS文件,可以在Master页面中添加一个服务器端隐藏字段,把邮箱值存进去,然后JS从这个隐藏字段读取:
- 修改Master页面,添加隐藏字段:
<div class="col-md-12"> <div id="userEmailDiv"></div> <asp:HiddenField ID="hfUserEmail" runat="server" /> </div>
- 在服务器端Page_Load中给隐藏字段赋值:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { UserManager userManager = UserManager.GetManager(); User currentUser = userManager.GetCurrentUser(); if(currentUser != null) { SitefinityProfile profile = userManager.GetUserProfile<SitefinityProfile>(currentUser); UserEmail = profile.Email; hfUserEmail.Value = profile.Email; } } }
- 修改外部JS文件,读取隐藏字段的值:
document.addEventListener("DOMContentLoaded", function() { var userEmailElement = document.getElementById("userEmailDiv"); var hiddenField = document.getElementById("<%= hfUserEmail.ClientID %>"); if (userEmailElement && hiddenField) { userEmailElement.innerText = hiddenField.value; } });
方案三:通过全局变量传递值
在Master页面中定义一个全局JS变量,把服务器端的邮箱值赋值给它,然后外部JS文件直接使用这个变量:
- 在Master页面的
<head>或<body>中添加脚本:
<script type="text/javascript"> var globalUserEmail = "<%= UserEmail %>"; </script> <script src="~/Scripts/userEmailScript.js" type="text/javascript"></script>
- 修改外部JS文件:
document.addEventListener("DOMContentLoaded", function() { var userEmailElement = document.getElementById("userEmailDiv"); if (userEmailElement) { userEmailElement.innerText = globalUserEmail; } });
服务器端代码优化建议
原来的服务器端获取Profile的代码可能存在隐患,建议修改为明确获取当前登录用户的方式:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { UserManager userManager = UserManager.GetManager(); // 获取当前登录用户 User currentUser = userManager.GetCurrentUser(); if(currentUser != null && !currentUser.IsBackendUser) // 可选:排除后台用户 { // 明确指定用户获取Profile SitefinityProfile profile = userManager.GetUserProfile<SitefinityProfile>(currentUser); if(profile != null) { UserEmail = profile.Email; } } } }
这样可以避免因未指定用户导致的Profile获取失败问题。
备注:内容来源于stack exchange,提问作者RataCross

