Вот то, что Вы хотите сделать, сначала определите свою карту маршрутов:
routes.MapRoute(
"Users",
"{username}",
new { controller = "User", action="index", username=""});
, Что благодаря этому сделать необходимо установить следующее соглашение:
Поэтому, когда Вы запросите 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.
Вы могли бы хотеть рассмотреть не позволяющие имена пользователей определенных типов, если Вы хотите иметь некоторые другие функциональные контроллеры как Учетная запись, Администратор, Профиль, Настройки, И т.д. Также Вы могли бы хотеть, чтобы Ваше статическое содержание не инициировало маршрут "имени пользователя". Для достижения такой функциональности (подобный тому, как 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 = "" }
);
Затем у Вас должен будет быть контроллер для каждого из маркеров в ограничительной строке (например, администратор, справка, профиль, настройки), а также контроллер именованные пользователи и конечно контроллер по умолчанию Дома в этом примере.
, Если у Вас есть много имен пользователей, Вы не хотите позволять, затем Вы могли бы рассмотреть более динамический подход путем создания пользовательского обработчика маршрутов.
У Вас мог быть маршрут, который похож:
{username}
со значениями по умолчанию
Controller = "Users"
Для готового изделия:
routes.MapRoute(
"Users",
"{username}",
new { controller = "Users" }
Так, чтобы Имя пользователя было единственным параметром URL, MVC предполагает, что это передает его пользовательскому контроллеру.
Вы пытаетесь передать его в качестве параметра Контроллеру?
Теоретически Вы могли сделать что-то вроде этого:
маршруты. MapRoute ("имя", "{пользователь} / {контроллер} / {действие}", новый {контроллер = "вздор", действие = "вздор", пользователь = ""})
я не слишком испытан с маршрутизацией ASP.NET, но я полагаю, что должен работа.
routes.MapRoute(
"Users",
"{username}",
new { controller = "Users", action="ShowUser", username=""});
хорошо, то, что это сделает, является значением по умолчанию параметр имени пользователя к значению {имени пользователя}
поэтому даже при том, что Вы записали имя пользователя = "", это будет знать для передачи значения {имени пользователя}.. на основании строкового соответствия.
Это ожидало бы
для формы URL