Подтвердить что ты не робот

ASP.Net MVC Route to Username

Я пытаюсь создать маршрут с именем пользователя...

Таким образом, URL-адрес будет mydomain.com/abrudtkhul (abrudtkhul является именем пользователя)

Мое приложение будет иметь общедоступные профили, основанные на именах пользователей (пример: http://delicious.com/abrudtkuhl). Я хочу реплицировать эту схему URL.

Как я могу структурировать это в ASP.Net MVC? Я также использую поставщиков членства/ролей.

4b9b3361

Ответ 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 (метод)