我实现了ASP.NET用户控件。
每个用户都可以login并更新他们的个人数据,例如在私人页面myData.html
现在,我希望将其个人资料的一部分显示在公共只读页面上,例如userGreg45public.html
我如何实现或修改用户控件,以允许每个用户拥有自己独特的公共页面?
(注意:有一组“文件名”对每个用户来说都是相同的,因为只有当某个特定的用户login时才能访问这些文件。例如,myData.html具有相同的名称,但显示的是不同的数据login。“公共页面”必须为每个成员具有唯一的文件名)
谢谢。
这听起来像问题是你想每个用户有自己的网址…是这样的情况?
您可以使用URL重写。 其中一种更简单的方法是在Global.asax
文件的Application_BeginRequest
方法中使用HttpContext.RewritePath 。
编辑:添加示例代码
我在这里做一些假设…我做的假设是a)用户有名字,b)用户有姓和c)用户有一些唯一的标识符,在我的情况下我使用“userId” 。
首先,你必须决定公共网址的格式。 像这样的东西可以工作:
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事件。
接下来是正确的正则表达式。 它基本上匹配任何请求到您的用户配置文件页面,并在内部告诉ASP.Net将请求路由到另一个页面。 新的请求将如下所示:
http://www.yoursite.com/public/userProfile.aspx?userId=1234
实现/public/userProfile.aspx
页面由您决定。 有很多方法可以只读。 这可能是直接用标签控件替换TextBox控件?
如果您想要公开多个页面,则可以实现多个重写规则。 (虽然在某些时候你最好使用这样或那样的组件)。
作为一个供参考,我参考了这个页面上的样本来进行重写。 如果您有任何问题,请告诉我。
您可以默认为访问该网站的用户分配角色,如“访客”。
我只是在网站上实现了这样的东西。 我创建了两个页面。 一个是私人的,并要求用户登录。该页面允许用户编辑他们的个人资料。
另一页是公共页面。 它不允许编辑,并在任何人都可以查看的位置。