Как определить универсальный маршрут для сайта ASP.NET MVC? - PullRequest
8 голосов
/ 20 октября 2008

У меня есть новостной сайт со статьями, помеченными в категориях.

Мой контроллер называется «Категория» и этот URL:

http://mysite.com/Category/Sport

передает Sport в действие Index в контроллере Category.

Я хочу разрешить следующие URL:

http://mysite.com/Sport/Hockey
http://mysite.com/Sport/Football
http://mysite.com/Science/Evolution

, который передает всю информацию категории действию Index в контроллере Category.

Как мне создать универсальный маршрут, который обрабатывает все это и переводит их в категорию?

Ответы [ 2 ]

2 голосов
/ 20 октября 2008

На мой вопрос довольно неплохой ответ: здесь .

0 голосов
/ 17 мая 2016

Вы можете сделать это так:

routes.MapRoute("Default", "{category}/{subcategory}",
    new { controller = "CategoryController", action = "Display", id = "" }
);

и затем в вашем контроллере:

public class CategoryController : Controller
{
    public ActionResult Display(string category, string subcategory)
    {
        // do something here.
    }
}

Не указывайте, что любой маршрут выше будет использоваться для ВСЕХ маршрутов (у вас не может быть страницы О программе и т. Д., Если вы не укажете явные маршруты перед указанным выше).

Однако вы можете включить пользовательское ограничение, чтобы ограничить маршрут только существующими категориями. Что-то вроде:

public class OnlyExistingCategoriesConstraint : IRouteConstraint
{
    public bool Match
        (
            HttpContextBase httpContext,
            Route route,
            string parameterName,
            RouteValueDictionary values,
            RouteDirection routeDirection
        )
    {
        var category = route.DataTokens["category"];
        //TODO: Look it up in your database etc


        // fake that the category exists
        return true;
    }
}

Что вы используете в своем маршруте, как это:

routes.MapRoute("Default", 
    "{category}/{subcategory}",
    new { controller = "CategoryController", action = "Display", id = "" },
    new { categoryExists = new OnlyExistingCategoriesConstraint() }
);

Таким образом, он не будет мешать другим вашим определенным маршрутам.

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