Вопрос маршрутизации ASP.NET MVC - PullRequest
13 голосов
/ 18 декабря 2008

Я должен быть плотным. Задав несколько вопросов о StackOverflow, я все еще в растерянности, когда дело доходит до понимания нового механизма маршрутизации, поставляемого с ASP.NET MVC. Я думаю, что я сузил проблему до очень простой, которая, если она будет решена, вероятно, позволит мне решить остальную часть моих проблем маршрутизации. Итак, вот оно:

Как бы вы зарегистрировали маршрут для поддержки Twitter-подобного URL для профилей пользователей?

www.twitter.com/username

Предположим, что необходимо также поддерживать:

  • маршрут по умолчанию {controller}/{action}/{id}.

  • URL-адреса, такие как:

    www.twitter.com/login
    www.twitter.com/register

Возможно ли это?

Ответы [ 6 ]

10 голосов
/ 18 декабря 2008

А как же

routes.MapRoute(
    "Profiles",
    "{userName}",
    new { controller = "Profiles", action = "ShowUser" }
);

и затем в ProfilesController будет функция

public ActionResult ShowUser(string userName)
{
...

Если в функции не найден пользователь с указанным именем пользователя, вам следует перенаправить на маршрут по умолчанию {controller} / {action} / {id} (здесь это будет просто {controller}).

URL-адреса, такие как www.twitter.com/login, должны быть зарегистрированы до этого.

routes.MapRoute(
    "Login",
    "Login",
    new { controller = "Security", action = "Login" }
);
4 голосов
/ 18 декабря 2008

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

Для вашей проблемы я бы зарегистрировал правила маршрутизации для каждой специальной страницы, такие как «регистрация» и «вход в систему» ​​перед правилом имени пользователя.

0 голосов
/ 04 февраля 2010

Вот альтернативный способ регистрации стандартного маршрута:

1. Загрузите RiaLibrary.Web.dll и укажите ссылку в проекте ASP.NET MVC на веб-сайте

2. Обесцените методы контроллера с помощью атрибутов [Url]:

public SiteController : Controller
{
    [Url("")]
    public ActionResult Home()
    {
        return View();
    }

    [Url("about")]
    public ActionResult AboutUs()
    {
        return View();
    }

    [Url("store/{?category}")]
    public ActionResult Products(string category = null)
    {
        return View();
    }
}

Кстати, '?' Параметр входа в систему {? category} означает, что он необязательный. Вам не нужно указывать это явно в настройках маршрута по умолчанию, что равно следующему:

routes.MapRoute("Store", "store/{category}",
new { controller = "Store", action = "Home", category = UrlParameter.Optional });

3. Обновить файл Global.asax.cs

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoutes(); // This do the trick
    }

    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }
}

Как установить значения по умолчанию и ограничения? Пример:

public SiteController : Controller
{
    [Url("admin/articles/edit/{id}", Constraints = @"id=\d+")]
    public ActionResult ArticlesEdit(int id)
    {
        return View();
    }

    [Url("articles/{category}/{date}_{title}", Constraints =
         "date=(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])")]
    public ActionResult Article(string category, DateTime date, string title)
    {
        return View();
    }
}

Как настроить порядок? Пример:

[Url("forums/{?category}", Order = 2)]
public ActionResult Threads(string category)
{
    return View();
}

[Url("forums/new", Order = 1)]
public ActionResult NewThread()
{
    return View();
}
0 голосов
/ 06 ноября 2009

я думаю, что ваш вопрос похож на мой. ASP.NET MVC Routing

вот что Роберт Харви ответил.

routes.MapRoute( _
    "SearchRoute", _
    "{id}", _
    New With {.controller = "User", .action = "Profile", .id = ""} _

)

0 голосов
/ 18 декабря 2008

ОК. Я никогда не пробовал это должным образом, но вы пытались расширить класс RouteBase для работы с пользователями. Документы для RouteBase предполагают, что метод GetRouteData должен возвращать ноль, если он не соответствует текущему запросу. Вы можете использовать это, чтобы проверить, что запрос соответствует одному из ваших имен пользователей.

Вы можете добавить подкласс RouteBase, используя:

  routes.Add(new UserRouteBase());

При регистрации маршрутов.

Может быть стоит расследовать.

0 голосов
/ 18 декабря 2008

Вы можете справиться с этим в домашнем контроллере, но метод контроллера не будет очень элегантным. Я предполагаю что-то вроде это может работать (не проверено):

routes.MapRoute(
    "Root",
    "{controller}/{view}",
    new { controller = "Home", action = "Index", view = "" }
);

Тогда в вашем HomeController:

public ActionResult Index(string view) {
    switch (view) {
        case "":
            return View();

        case "register":
            return View("Register");

        default: 
            // load user profile view
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...