登录后如何更改到用户名的路由?

用户名

用户登录前,路由为:

localhost:54274/Home
localhost:54274/Home/About
localhost:54274/Home/Contact
localhost:54274/Home/Login
localhost:54274/Home/Register

用户登录后,路由为:

1. localhost:54274/Project
2. localhost:54274/Project/Create
3. localhost:54274/Project/Edit/1
4. localhost:54274/Project/Delete/2
5. localhost:54274/Project/1/Requirement
6. localhost:54274/Project/1/Requirement/Create
7. localhost:54274/Project/1/Requirement/Edit/3
8. localhost:54274/Project/1/Requirement/Delete/4

我希望用户登录后将路由更改为用户名。例如,用户名是hendyharf。

1. localhost:54274/hendyharf/Project
2. localhost:54274/hendyharf/Project/Create
3. localhost:54274/hendyharf/Project/Edit/1
4. localhost:54274/hendyharf/Project/Delete/2
5. localhost:54274/hendyharf/Project/1/Requirement
6. localhost:54274/hendyharf/Project/1/Requirement/Create
7. localhost:54274/hendyharf/Project/1/Requirement/Edit/3
8. localhost:54274/hendyharf/Project/1/Requirement/Delete/4

我的项目控制器只有3个控制器:HomeControllerProjectController,和RequirementController

RouteConfig.cs仍处于默认状态

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

我应该怎么做才能将路由更改为用户名?

夜猫子888

您需要添加一条路由来覆盖具有用户名的案例。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Username_Default",
        url: "{username}/{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        constraints: new { username = new OwinUsernameConstraint() }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

但是,要使其正常工作,您将需要在URL中添加文字字符串以将该段标识为用户名(即username-{username}\),或者需要进行限制以仅允许数据库中的用户名。这是后者的一个示例:

using MvcUsernameInUrl.Models;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.Caching;
using System.Web.Routing;

namespace MvcUsernameInUrl
{
    public class OwinUsernameConstraint : IRouteConstraint
    {
        private object synclock = new object();

        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            if (parameterName == null)
                throw new ArgumentNullException("parameterName");
            if (values == null)
                throw new ArgumentNullException("values");

            object value;
            if (values.TryGetValue(parameterName, out value) && value != null)
            {
                string valueString = Convert.ToString(value, CultureInfo.InvariantCulture);
                return this.GetUsernameList(httpContext).Contains(valueString);
            }
            return false;
        }

        private IEnumerable<string> GetUsernameList(HttpContextBase httpContext)
        {
            string key = "UsernameConstraint.GetUsernameList";
            var usernames = httpContext.Cache[key];
            if (usernames == null)
            {
                lock (synclock)
                {
                    usernames = httpContext.Cache[key];
                    if (usernames == null)
                    {
                        // Retrieve the list of usernames from the database
                        using (var db = ApplicationDbContext.Create())
                        {
                            usernames = (from users in db.Users
                                            select users.UserName).ToList();
                        }

                        httpContext.Cache.Insert(
                            key: key,
                            value: usernames,
                            dependencies: null,
                            absoluteExpiration: Cache.NoAbsoluteExpiration,
                            slidingExpiration: TimeSpan.FromSeconds(15),
                            priority: CacheItemPriority.NotRemovable,
                            onRemoveCallback: null);
                    }
                }
            }

            return (IEnumerable<string>)usernames;
        }
    }
}

注意:我强烈建议像在示例中那样为此使用缓存,因为路由约束会在每个请求上运行,并且在每个请求上都命中数据库是不好的。这样做的缺点是,用户名注册后最多需要15秒才能生效。除了将记录添加到数据库之外,还可以通过在注册新帐户时更新缓存(以线程安全的方式)(以线程安全的方式)来解决此问题,这将使其立即在路由约束中可用。

然后,只需在用户登录时进行302重定向即可。您可以在全局过滤器中进行此操作

using System.Web;
using System.Web.Mvc;

namespace MvcUsernameInUrl
{
    public class RedirectLoggedOnUserFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var routeValues = filterContext.RequestContext.RouteData.Values;
            bool isLoggedIn = filterContext.HttpContext.User.Identity.IsAuthenticated;
            bool requestHasUserName = routeValues.ContainsKey("username");

            if (isLoggedIn && !requestHasUserName)
            {
                var userName = filterContext.HttpContext.User.Identity.Name;
                // Add the user name as a route value
                routeValues.Add("username", userName);

                filterContext.Result = new RedirectToRouteResult(routeValues);
            }
            else if (!isLoggedIn && requestHasUserName)
            {
                // Remove the user name as a route value
                routeValues.Remove("username");

                filterContext.Result = new RedirectToRouteResult(routeValues);
            }
        }

        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            // Do nothing
        }
    }
}

用法

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new RedirectLoggedOnUserFilter());
        filters.Add(new HandleErrorAttribute());
    }
}

MVC会在生成URL时自动重用请求中的路由值,因此无需更改任何ActionLinks包含的内容username

这是在GitHub上使用MVC5,OWIN和ASP.NET Identity的工作演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用基于FORM的身份验证登录后如何获取用户名

来自分类Dev

成功登录后的HTML PHP显示用户名

来自分类Dev

如何从.htpasswd登录用户名?

来自分类Dev

成功登录php后如何显示用户名?

来自分类Dev

登录Nodejs App后很难显示用户名

来自分类Dev

使用锚标记登录后如何显示用户名

来自分类Dev

如何使用登录名(用户名和密码),按钮更改活动?

来自分类Dev

如何根据用户名更改目录?

来自分类Dev

如何更改用户名

来自分类Dev

输入错误的用户名和密码后,如何使脚本不崩溃?(smtplib-gmail登录)

来自分类Dev

如何从.htpasswd登录用户名?

来自分类Dev

在登录表单中输入用户名/密码后如何转到特定用户的记录

来自分类Dev

登录到Office帐户后,是否可以更改Word 2013跟踪更改的用户名?

来自分类Dev

在Microsoft Access中登录后如何放置欢迎“用户名”?

来自分类Dev

成功登录后,显示注销按钮以及用户名

来自分类Dev

更改用户名后,新的用户名不会显示在登录窗口中

来自分类Dev

更改用户名而不登录

来自分类Dev

登录后如何打印用户名?

来自分类Dev

没有数据库登录后如何显示用户名

来自分类Dev

登录后无法显示用户名

来自分类Dev

用户登录后,如何将导航栏从“登录”更改为“用户名”?

来自分类Dev

登录系统,输入用户名和密码后登录

来自分类Dev

如何更改用户名域

来自分类Dev

如何正确编写在登录后显示用户名的 PHP 代码?

来自分类Dev

如何找出登录机器的用户名?

来自分类Dev

如何更改我的用户名?

来自分类Dev

登录后如何重定向到我想要的页面,登录成功后如何显示用户名

来自分类Dev

用户登录成功后,如何通过路由器立即将用户重定向到新页面(密码,用户名正确)

来自分类Dev

用户使用 firebase 登录后,如何将 nav_header 的 TextView 更改为用户名?

Related 相关文章

  1. 1

    使用基于FORM的身份验证登录后如何获取用户名

  2. 2

    成功登录后的HTML PHP显示用户名

  3. 3

    如何从.htpasswd登录用户名?

  4. 4

    成功登录php后如何显示用户名?

  5. 5

    登录Nodejs App后很难显示用户名

  6. 6

    使用锚标记登录后如何显示用户名

  7. 7

    如何使用登录名(用户名和密码),按钮更改活动?

  8. 8

    如何根据用户名更改目录?

  9. 9

    如何更改用户名

  10. 10

    输入错误的用户名和密码后,如何使脚本不崩溃?(smtplib-gmail登录)

  11. 11

    如何从.htpasswd登录用户名?

  12. 12

    在登录表单中输入用户名/密码后如何转到特定用户的记录

  13. 13

    登录到Office帐户后,是否可以更改Word 2013跟踪更改的用户名?

  14. 14

    在Microsoft Access中登录后如何放置欢迎“用户名”?

  15. 15

    成功登录后,显示注销按钮以及用户名

  16. 16

    更改用户名后,新的用户名不会显示在登录窗口中

  17. 17

    更改用户名而不登录

  18. 18

    登录后如何打印用户名?

  19. 19

    没有数据库登录后如何显示用户名

  20. 20

    登录后无法显示用户名

  21. 21

    用户登录后,如何将导航栏从“登录”更改为“用户名”?

  22. 22

    登录系统,输入用户名和密码后登录

  23. 23

    如何更改用户名域

  24. 24

    如何正确编写在登录后显示用户名的 PHP 代码?

  25. 25

    如何找出登录机器的用户名?

  26. 26

    如何更改我的用户名?

  27. 27

    登录后如何重定向到我想要的页面,登录成功后如何显示用户名

  28. 28

    用户登录成功后,如何通过路由器立即将用户重定向到新页面(密码,用户名正确)

  29. 29

    用户使用 firebase 登录后,如何将 nav_header 的 TextView 更改为用户名?

热门标签

归档