Я пытаюсь создать маршрут с именем пользователя ...
Таким образом, URL-адрес будет mydomain.com/abrudtkhul (abrudtkhul - имя пользователя)
В моем приложении будут общедоступные профили на основе имен пользователей (например, http://delicious.com/abrudtkuhl). Я хочу воспроизвести эту схему URL.
Как я могу структурировать это в ASP.Net MVC? Я тоже использую поставщиков членства / ролей.





У вас может быть маршрут, который выглядит так:
{username}
со значениями по умолчанию
Controller = "Users"
Для готового продукта:
routes.MapRoute(
"Users",
"{username}",
new { controller = "Users" }
Так что имя пользователя является единственным параметром URL-адреса, MVC предполагает, что он передает его контроллеру пользователей.
Я предполагаю, что все они будут придерживаться одного и того же взгляда. Ваше представление можно называть как угодно, если вы вызываете перегрузку View (string), а aspx представления находится в подкаталоге Users в разделе Views.
Вы также должны указать действие. измените новую часть на: new {controller = "Users", action = "Show"} или как хотите.
Вы пытаетесь передать его как параметр контроллеру?
Теоретически можно было бы сделать что-то вроде этого:
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
Вот что вы хотите сделать, сначала определите карту маршрута:
routes.MapRoute(
"Users",
"{username}",
new { controller = "User", action = "index", username = ""});
Это позволяет вам установить следующее соглашение:
Поэтому, когда вы запрашиваете 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)
Я получаю пустое имя пользователя в модели Binder Почему?
@Keith Все работает нормально, но маршрутизация URL не работает
Возможно, вы захотите рассмотреть возможность запрета использования имен пользователей определенных типов, если вы хотите иметь некоторые другие функциональные контроллеры, такие как учетная запись, администратор, профиль, настройки и т. д. Также вы можете захотеть, чтобы ваш статический контент не запускал маршрут «имя пользователя». Для достижения такой функциональности (аналогично тому, как обрабатываются 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 по умолчанию в этом примере.
Если у вас много имен пользователей, которые вы не хотите разрешать, вы можете рассмотреть более динамичный подход, создав собственный обработчик маршрута.
Указание ограничений - правильный способ сделать это. Больше у меня ничего не работало. Он будет продолжать использовать маршрутизацию по умолчанию без ограничений. Спасибо, что поделились своим решением.
Да, мой тоже работает при добавлении ограничений. Как вы думаете, почему это происходит?
Как мне добиться этого с помощью ядра asp.net?
Хорошо, у меня это было ... но по какой-то причине не работает. Что мне делать с просмотром?