ASP.Net MVC Route to Username
Я пытаюсь создать маршрут с именем пользователя...
Таким образом, URL-адрес будет mydomain.com/abrudtkhul (abrudtkhul является именем пользователя)
Мое приложение будет иметь общедоступные профили, основанные на именах пользователей (пример: http://delicious.com/abrudtkuhl). Я хочу реплицировать эту схему URL.
Как я могу структурировать это в ASP.Net MVC? Я также использую поставщиков членства/ролей.
Ответы
Ответ 1
Здесь, что вы хотите сделать, сначала определите свою карту маршрута:
routes.MapRoute(
"Users",
"{username}",
new { controller = "User", action="index", username=""});
Что вы можете сделать, это настроить следующее соглашение:
- Контроллер: Пользователь (тип UserController)
- Действие: индекс (это сопоставляется с методом индекса UserController)
- Имя пользователя: это параметр для метода Index
Поэтому, когда вы запрашиваете url http://mydomain.com/javier, это будет переведено на вызов для UserController.Index(имя пользователя строки), где 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.
Ответ 2
Возможно, вы захотите рассмотреть вопрос о том, чтобы не разрешать имена пользователей определенных типов, если вы хотите иметь некоторые другие функциональные контроллеры, такие как Account, Admin, Profile, Settings и т.д. Также вы можете захотеть, чтобы ваш статический контент не запускал маршрут "имя пользователя". Чтобы достичь такой функциональности (подобно тому, как обрабатываются URL-адреса twitter), вы можете использовать следующие маршруты:
// 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 = "" }
);
Затем вам понадобится контроллер для каждого из токенов в строке ограничения (например, admin, help, profile, settings), а также контроллер с именем Users и, конечно же, контроллер по умолчанию Home в этом примере.
Если у вас много имен пользователей, которые вы не хотите разрешать, вы можете рассмотреть более динамичный подход, создав собственный обработчик маршрута.
Ответ 3
У вас может быть маршрут, который выглядит так:
{username}
со значениями по умолчанию
Controller = "Users"
Для готового продукта:
routes.MapRoute(
"Users",
"{username}",
new { controller = "Users" }
Чтобы имя пользователя было единственным параметром url, MVC предполагает, что он передает его в пользовательский контроллер.
Ответ 4
Вы пытаетесь передать его как параметр контроллеру?
Теоретически вы можете сделать что-то вроде этого:
routes.MapRoute( "name", "{user}/{controller}/{action}", new {controller = "blah", action = "blah", user = ""})
Я не слишком опытен с маршрутизацией ASP.NET, но считаю, что это должно работать.
Ответ 5
routes.MapRoute(
"Users",
"{username}",
new { controller = "Users", action="ShowUser", username=""});
Хорошо, что это будет делать, это по умолчанию параметр username для значения {username}
так что, даже если вы написали username = "", он будет знать, чтобы передать значение {username}.. в силу соответствия строк.
Это ожидало бы
для формы URL
http://website.com/username
- Пользователи Contoller
- Действие ShowUser (метод в контроллере)
- параметр имени пользователя в действии ShowUser (метод)