我正在尝试创建一个带有用户名的路由
所以URL是mydomain.com/abrudtkhul(abrudtkhul是用户名)
我的应用程序将有基于用户名的公共配置文件(例如:http://delicious.com/abrudtkuhl)。我想复制这个URL方案。
我如何在ASP.Net MVC中构建这个?我也在使用会员/角色提供商。
解决方法
这是您要做的,首先定义您的路线图:
routes.MapRoute( "Users","{username}",new { controller = "User",action="index",username=""});
这允许你做的是设置以下惯例:
>控制器:用户(UserController类型)
> Action:Index(这被映射到UserController的Index方法)
>用户名:这是Index方法的参数
所以当你请求url http://mydomain.com/javier时,这将被转换为UserController.Index(string username)的调用,其中username被设置为javier的值。
现在,由于您计划使用MembershipProvider类,因此您希望更像这样:
public ActionResult Index(MembershipUser usr) { ViewData["Welcome"] = "Viewing " + usr.UserName; return View(); }
为了做到这一点,您需要使用ModelBinder来完成从用户名到MembershipUser类型的工作。为此,您将需要创建自己的ModelBinder类型并将其应用于Index方法的用户参数。你的课程可以看起来像这样:
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类型的有效实例。