ASP.Net MVC Маршрут к имени пользователя - PullRequest
23 голосов
/ 25 октября 2008

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

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

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

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

Ответы [ 5 ]

26 голосов
/ 25 октября 2008

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

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

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

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

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

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

17 голосов
/ 22 февраля 2009

Возможно, вы захотите запретить использование имен пользователей определенных типов, если вы хотите иметь некоторые другие функциональные контроллеры, такие как учетная запись, администратор, профиль, настройки и т. Д. Также вам может потребоваться, чтобы статический контент не вызывал маршрут «имя пользователя». Для достижения такой функциональности (аналогично тому, как обрабатываются ссылки в твиттере) вы можете использовать следующие маршруты:

// 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 в этом примере. .

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

1 голос
/ 25 октября 2008

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

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

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

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

1 голос
/ 25 октября 2008
routes.MapRoute(
             "Users",
              "{username}", 
              new { controller = "Users", action="ShowUser", username=""});

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

.

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

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

для формы URL

http://website.com/username

  • Пользователи Contoller
  • Действие ShowUser (метод в контроллере)
  • параметр имени пользователя в действии ShowUser (метод)
1 голос
/ 25 октября 2008

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

{username}

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

Controller = "Users"

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

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

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

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