ASP.NET маршрут MVC к имени пользователя

23
задан casperOne 6 March 2010 в 01:36
поделиться

5 ответов

Вот то, что Вы хотите сделать, сначала определите свою карту маршрутов:

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

, Что благодаря этому сделать необходимо установить следующее соглашение:

  • Контроллер: Пользователь (тип UserController)
  • Действие: Индекс (это отображается на Индексном методе UserController)
  • Имя пользователя: Это - параметр для Индексного метода

Поэтому, когда Вы запросите url http://mydomain.com/javier, это будет переведено в призыв UserController. Индекс (представляют имя пользователя в виде строки) , где имя пользователя установлено на значение javier.

Теперь, так как Вы - планирование использования классов MembershipProvider, Вы хотите к чему-то больше как это:

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

    return View();
 }

, Чтобы сделать это, необходимо будет использовать ModelBinder, чтобы сделать работу, ну, в общем, привязки от имени пользователя до типа MembershipUser. Чтобы сделать это, необходимо будет создать собственный тип ModelBinder и применить его к пользовательскому параметру Индексного метода. Ваш класс может выглядеть примерно так:

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);
   }
}

Это позволяет Вам изменять объявление Индексного метода, чтобы быть:

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

, Как Вы видите, мы подали заявку [ModelBinder (typeof (UserBinder))] атрибут к параметру метода. Это означает, что, прежде чем Ваш метод называют логикой Вашего , тип UserBinder назовут таким к тому времени, когда метод называют, у Вас будет допустимый экземпляр Вашего типа MembershipUser.

26
ответ дан Javier Lozano 29 November 2019 в 01:46
поделиться

Вы могли бы хотеть рассмотреть не позволяющие имена пользователей определенных типов, если Вы хотите иметь некоторые другие функциональные контроллеры как Учетная запись, Администратор, Профиль, Настройки, И т.д. Также Вы могли бы хотеть, чтобы Ваше статическое содержание не инициировало маршрут "имени пользователя". Для достижения такой функциональности (подобный тому, как 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 = "" }
);

Затем у Вас должен будет быть контроллер для каждого из маркеров в ограничительной строке (например, администратор, справка, профиль, настройки), а также контроллер именованные пользователи и конечно контроллер по умолчанию Дома в этом примере.

, Если у Вас есть много имен пользователей, Вы не хотите позволять, затем Вы могли бы рассмотреть более динамический подход путем создания пользовательского обработчика маршрутов.

17
ответ дан Steve Tranby 29 November 2019 в 01:46
поделиться

У Вас мог быть маршрут, который похож:

{username}

со значениями по умолчанию

Controller = "Users"

Для готового изделия:

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

Так, чтобы Имя пользователя было единственным параметром URL, MVC предполагает, что это передает его пользовательскому контроллеру.

1
ответ дан Jason Whitehorn 29 November 2019 в 01:46
поделиться

Вы пытаетесь передать его в качестве параметра Контроллеру?

Теоретически Вы могли сделать что-то вроде этого:

маршруты. MapRoute ("имя", "{пользователь} / {контроллер} / {действие}", новый {контроллер = "вздор", действие = "вздор", пользователь = ""})

я не слишком испытан с маршрутизацией ASP.NET, но я полагаю, что должен работа.

1
ответ дан WillCodeForCoffee 29 November 2019 в 01:46
поделиться
routes.MapRoute(
             "Users",
              "{username}", 
              new { controller = "Users", action="ShowUser", username=""});

хорошо, то, что это сделает, является значением по умолчанию параметр имени пользователя к значению {имени пользователя}

поэтому даже при том, что Вы записали имя пользователя = "", это будет знать для передачи значения {имени пользователя}.. на основании строкового соответствия.

Это ожидало бы

для формы URL

http://website.com/username

  • Пользователи Contoller
  • Действие ShowUser (метод в контроллере)
  • параметр имени пользователя на действии ShowUser (метод)
1
ответ дан danswain 29 November 2019 в 01:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: