我实现了ASP.NET用户控件。
每个用户都可以登录并更新他们的个人数据,例如在私人页面myData.html
现在,我希望他们的个人资料的一部分能够显示在公开的只读页面上,例如 - userGreg45public.html
如何实施或修改用户控件,以允许每个用户拥有自己的唯一公共页面?
(注意 - 每个用户都有一组“文件”命名完全相同,因为只有在特定人员登录时才能访问这些文件。例如,myData.html具有相同的名称但显示不同的数据基于谁登录。“公共页面”必须为每个成员提供唯一的文件名
谢谢。
答案 0 :(得分:4)
听起来问题是你希望每个用户都拥有自己的网址......是这样的吗?
您可以使用网址重写。一种更简单的方法是在Application_BeginRequest
文件的Global.asax
方法中使用HttpContext.RewritePath。
编辑:添加了示例代码
我在这里做了一些假设...我所做的假设是:a)用户有名字,b)用户有姓氏,c)用户有一些唯一标识符,在我的情况下,我使用的是“用户id”。
首先,您必须决定公共网址的格式。这样的事情可以奏效:
http://www.yoursite.com/public/firstname-lastname-1234.aspx
其中1234是userId。
接下来,您将需要一个函数来构建这些URL。也许是这样的事情:
String ToPublicUrl(String firstName, String lastName, int userId)
{
return String.Format("http://www.yoursite.com/public/{0}-{1}-{2}.aspx",
Regex.Replace(firstName, "[^a-zA-Z]", ""),
Regex.Replace(lastName, "[^a-zA-Z]", ""),
userId);
}
请注意我是如何删除任何非字母字符的。
现在,在Global.asax文件中,添加以下代码:
static Regex ProfileRegex = new Regex(@"/public/(?<firstname>[a-zA-Z]+)-(?<lastname>[a-zA-Z]+)-(?<userid>[0-9]+)\.aspx$",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
void Application_BeginRequest(object sender, EventArgs e)
{
Match match = ProfileRegex.Match(Context.Request.FilePath);
if( (match != null) && match.Success )
{
Context.RewritePath((String.Format("~/public/userProfile.aspx?userId={0}",
match.Groups["userid"]));
}
}
这里有很多东西。首先,通过简单地定义此函数,ASP.Net将订阅它为HttpApplication.BeginRequest事件。
接下来是Regex进行繁重的工作。它基本上匹配任何对用户配置文件页面的请求,并在内部告诉ASP.Net将请求路由到另一个页面。新请求看起来像这样:
http://www.yoursite.com/public/userProfile.aspx?userId=1234
由您来实施/public/userProfile.aspx
页面。有许多方法可以让事情变得简单。它可能像使用TextBox控件替换Label控件一样直接吗?
如果您想要公开多个页面,则可以实现多个重写规则。 (虽然在某些时候你最好使用像this或this这样的组件。
作为一个FYI,我在this page上引用了重写内容的样本。如果您有任何问题,请告诉我。
答案 1 :(得分:2)
默认情况下,您可以为访问过该网站的用户分配“访客”等角色。
答案 2 :(得分:1)
我刚刚在网站上实现了类似的功能。我创建了两个页面。一个是私有的并且要求用户登录。该页面允许用户编辑他们的个人资料。
另一页是公共页面。它不允许编辑,它位于任何人都可以查看的位置。