我正在尝试使用用户名...
创建路线所以URL将是mydomain.com/abrudtkhul(abrudtkhul是用户名)
我的应用程序将具有基于用户名的公开配置文件(例如:http://delicious.com/abrudtkuhl)。我想复制这个URL方案。
我如何在ASP.Net MVC中构建它?我也在使用会员/角色提供商。
答案 0 :(得分:26)
这是你想要做的,首先定义你的路线图:
routes.MapRoute(
"Users",
"{username}",
new { controller = "User", action="index", username=""});
这允许您做的是设置以下约定:
因此,当您请求网址 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}的值。
这可能是
表示网址格式