Маркерный маршрут MVC 3, т. Е. Www.mydomain.com/username - PullRequest
3 голосов
/ 15 января 2012

Я хотел бы создать простой маршрут, который позволит мне указывать ТОЛЬКО один элемент в списке после базового URL (кроме случаев, когда это контроллер), и этот элемент будет передаваться в контроллер в качестве параметра.например:

www.mydomain.com / user1 www.mydomain.com/user2 www.mydomain.com/user3 www.mydomain.com/user3

где user1, user2 и т. д. являются именами пользователейи передаются динамически, т.е. я не хочу создавать контроллер для каждого имени пользователя.

естественно, я хотел бы убедиться, что что-то подобное возможно, что это не вызовет конфликтов с другим подлинным контроллеромимена, таким образом, я предполагаю, что у других контроллеров должны быть правила, созданные специально для них и перечисленные выше подстановочным маршрутом

Я не уверен, как это сделать, так как я предполагаю, что первый элемент после косой черты обычноcontroller.

есть идеи, как с этим справиться?

приведенные мною примеры могут показаться неоднозначными, когда я размещаю www.mydomain.com/user1 и т. д., это означает, что это может быть что угодно (т.е.имя пользователя), например, www.mydomain.com/jsmith, www.mydomain.com/djohnson, www.mydomain.com/sblake, www.mydomain.com/fheeley

идея заключается в том, что профиль пользователяможно найти, просто введя имя домена, затем косую черту и имя пользователя.

Ответы [ 4 ]

1 голос
/ 15 января 2012

Используйте определение маршрута, например

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

в вашем файле global.asax.cs , но оставьте его последним в списке определений маршрута.

MVC обрабатывает ваши сопоставления маршрутов сверху донизу, поэтому поместите наиболее общие сопоставления маршрутов сверху, а более конкретные - снизу.

После этого вам понадобятся соответствующиеконтроллер / действие, поэтому создайте новый контроллер с именем «UsersController» с действием с именем «View», например, следующим образом:

using System.Web.Mvc;

namespace Routes.Controllers
{
    public class UsersController : Controller
    {
        //
        // GET: /{username}
        public ActionResult List(string username)
        {
            // Get User from database/repository and pass to view
            var user = ...;
            return View(user);
        }
    }
}
1 голос
/ 15 января 2012

ASP.Net MVC маршруты обрабатываются сверху вниз, и как только совпадение найдено, оно не будет искать совпадение.Поэтому сначала укажите ваши наиболее конкретные маршруты, а последний - шаблон.Если ни один из конкретных маршрутов не совпадает, управление будет передано по маршруту с подстановочными знаками.

0 голосов
/ 15 января 2012

Создать маршрут, как показано ниже,

routes.MapRoute(
                "DefaultWithUser", // Route name
                "{user}/{controller}/{action}/{id}", // URL with parameters
                new { user=UrlParameter.Optional, controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );
0 голосов
/ 15 января 2012

Вы должны сделать следующее.

  1. Создайте один контроллер или Действие для дескриптора выше сценария. Например controller = "Home" и Action = "GetUser" public ActionResult GetUser (строка username) { // ты работаешь }
  2. В Global.asax (Топ маршрут) // Посмотрим на пункт 3 для UserNameConstraint

    route.MapRoute("UserRoute" , "{username}" , new { controller="Home" , action="GetUser" } , new { username = new UserNameConstraint() });
    

    // Укажите ваш маршрут по умолчанию после вышеупомянутого здесь

  3. Теперь для ограничения создания маршрута.

Надеюсь, это поможет вам.

    public class UserNameConstraint : IRouteConstraint
    {
    public bool Match(HttpContextBase httpContext, Route route, string parameterName,        RouteValueDictionary values, RouteDirection routeDirection)
     {
       List<string> userName = GetUserName from DB
      userName.Contain(values[parameterName].ToString());
     }
    }
...