You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sitefinity项目中获取并显示用户邮箱失败的问题求助

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从这个隐藏字段读取:

  1. 修改Master页面,添加隐藏字段:
<div class="col-md-12">
    <div id="userEmailDiv"></div>
    <asp:HiddenField ID="hfUserEmail" runat="server" />
</div>
  1. 在服务器端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;
        }
    }
}
  1. 修改外部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文件直接使用这个变量:

  1. 在Master页面的<head>或<body>中添加脚本:
<script type="text/javascript">
    var globalUserEmail = "<%= UserEmail %>";
</script>
<script src="~/Scripts/userEmailScript.js" type="text/javascript"></script>
  1. 修改外部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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 11:59:35