Как определить универсальный маршрут для сайта ASP.NET MVC?

StackOverflow https://stackoverflow.com/questions/218845

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Мой контроллер называется " Категория " и этот 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 .

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

Это было полезно?

Решение

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

Другие советы

Вы можете сделать это следующим образом:

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.
    }
}

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

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

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() }
);

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

scroll top