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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
23
0
8 523
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

У вас может быть маршрут, который выглядит так:

{username}

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

Controller = "Users"

Для готового продукта:

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

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

Хорошо, у меня это было ... но по какой-то причине не работает. Что мне делать с просмотром?

Andy Brudtkuhl 25.10.2008 00:31

Я предполагаю, что все они будут придерживаться одного и того же взгляда. Ваше представление можно называть как угодно, если вы вызываете перегрузку View (string), а aspx представления находится в подкаталоге Users в разделе Views.

Jason Whitehorn 25.10.2008 00:39

Вы также должны указать действие. измените новую часть на: new {controller = "Users", action = "Show"} или как хотите.

Carlton Jenke 25.10.2008 00:40

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

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

routes.MapRoute ("name", "{user} / {controller} / {action}", new {controller = "blah", action = "blah", user = ""})

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

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

Хорошо, что это будет делать, так это по умолчанию для параметра username значение {username}

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

Это можно было бы ожидать

для формы URL

http://website.com/username

  • Контроллер пользователей
  • ShowUser Action (метод в контроллере)
  • параметр username в действии (методе) ShowUser
Ответ принят как подходящий

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

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

Это позволяет вам установить следующее соглашение:

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

Поэтому, когда вы запрашиваете URL-адрес http://mydomain.com/javier, он будет преобразован в вызов для UserController.Index (строковое имя пользователя), где имя пользователя установлен в значение Хавьер.

Теперь, когда вы планируете использовать классы 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.

Это было изменено в более поздних выпусках MVC, теперь оно должно быть: объект BindModel (ControllerContext, controllerContext, ModelBindingContext, bindingContext)

Keith 02.06.2009 17:01

Я получаю пустое имя пользователя в модели Binder Почему?

Neeraj Mehta 02.04.2015 17:06

@Keith Все работает нормально, но маршрутизация URL не работает

Neeraj Mehta 03.04.2015 12:40

Возможно, вы захотите рассмотреть возможность запрета использования имен пользователей определенных типов, если вы хотите иметь некоторые другие функциональные контроллеры, такие как учетная запись, администратор, профиль, настройки и т. д. Также вы можете захотеть, чтобы ваш статический контент не запускал маршрут «имя пользователя». Для достижения такой функциональности (аналогично тому, как обрабатываются 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 по умолчанию в этом примере.

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

Указание ограничений - правильный способ сделать это. Больше у меня ничего не работало. Он будет продолжать использовать маршрутизацию по умолчанию без ограничений. Спасибо, что поделились своим решением.

Mandeep Janjua 18.02.2013 05:58

Да, мой тоже работает при добавлении ограничений. Как вы думаете, почему это происходит?

xabush 26.04.2016 13:39

Как мне добиться этого с помощью ядра asp.net?

Victor.Uduak 29.10.2017 01:05

Другие вопросы по теме