ASP.Net MVC路由到用户名

时间:2008-10-24 20:17:46

标签: asp.net-mvc

我正在尝试使用用户名...

创建路线

所以URL将是mydomain.com/abrudtkhul(abrudtkhul是用户名)

我的应用程序将具有基于用户名的公开配置文件(例如:http://delicious.com/abrudtkuhl)。我想复制这个URL方案。

我如何在ASP.Net MVC中构建它?我也在使用会员/角色提供商。

5 个答案:

答案 0 :(得分:26)

这是你想要做的,首先定义你的路线图:

routes.MapRoute(
             "Users",
              "{username}", 
              new { controller = "User", action="index", username=""});

这允许您做的是设置以下约定:

  • 控制器:用户(UserController类型)
  • 操作:索引(这映射到UserController的Index方法)
  • 用户名:这是索引方法的参数

因此,当您请求网址 http://mydomain.com/javier 时,这将转换为 UserController.Index(字符串用户名)的调用 >用户名设置为 javier 的值。

既然你计划使用MembershipProvider类,你想要更像这样的东西:

 public ActionResult Index(MembershipUser usr)
 {
    ViewData["Welcome"] = "Viewing " + usr.UserName;

    return View();
 }

为了做到这一点,您需要使用ModelBinder来完成从用户名到MembershipUser类型的绑定工作。为此,您需要创建自己的ModelBinder类型并将其应用于Index方法的user参数。你的课可以看起来像这样:

public class UserBinder : IModelBinder
{
   public ModelBinderResult BindModel(ModelBindingContext bindingContext)
   {
      var request = bindingContext.HttpContext.Request;
      var username = request["username"];
      MembershipUser user = Membership.GetUser(username);

      return new ModelBinderResult(user);
   }
}

这允许您将Index方法的声明更改为:

public ActionResult Index([ModelBinder(typeof(UserBinder))] 
    MembershipUser usr)
{
    ViewData["Welcome"] = "Viewing " + usr.Username;
    return View();
}

如您所见,我们已将 [ModelBinder(typeof(UserBinder))] 属性应用于方法的参数。这意味着在调用方法之前,将调用 UserBinder 类型的逻辑,因此在调用方法时,您将拥有MembershipUser类型的有效实例。

答案 1 :(得分:17)

如果您想要其他功能控制器(如帐户,管理员,个人资料,设置等),您可能需要考虑不允许使用某些类型的用户名。此外,您可能希望静态内容不会触发“用户名”路径。为了实现这种功能(类似于处理twitter URL的方式),您可以使用以下路由:

// do not route the following
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("content/{*pathInfo}"); 
routes.IgnoreRoute("images/{*pathInfo}");

// route the following based on the controller constraints
routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
    , new { controller = @"(admin|help|profile|settings)" } // Constraints
);

// this will catch the remaining allowed usernames
routes.MapRoute(
    "Users",
    "{username}",
    new { controller = "Users", action = "View", username = "" }
);

然后,您需要为约束字符串中的每个标记(例如,管理员,帮助,配置文件,设置)以及名为Users的控制器设置控制器,当然,在此示例中为Home的默认控制器

如果你有很多你不想允许的用户名,那么你可以通过创建自定义路由处理程序来考虑更加动态的方法。

答案 2 :(得分:1)

您的路线可能如下:

{username}

,默认值为

Controller = "Users"

对于成品:

    routes.MapRoute(
                    "Users",
                    "{username}",
                    new { controller = "Users" }

因此,用户名是唯一的url参数,MVC假定它将其传递给用户控制器。

答案 3 :(得分:1)

您是否尝试将其作为参数传递给控制器​​?

理论上你可以这样做:

routes.MapRoute(“name”,“{user} / {controller} / {action}”,new {controller =“blah”,action =“blah”,user =“”})

我对ASP.NET路由没有太多经验,但我认为应该工作。

答案 4 :(得分:1)

routes.MapRoute(
             "Users",
              "{username}", 
              new { controller = "Users", action="ShowUser", username=""});

好的,这样做会将username参数默认为{username}

的值

所以即使你写了username =“”,它也会知道通过字符串匹配传递{username}的值。

这可能是

表示网址格式

http://website.com/username

  • 用户控制器
  • ShowUser Action(控制器中的方法)
  • ShowUser操作上的用户名参数(方法)