Создание правила сквозного маршрута после правила по умолчанию

Как создать резервный (резервный) маршрут для продуктов после маршрута по умолчанию, который сопоставляется с контроллером продукта?

Вместо example.com/product/laptop я хочу example.com/laptop

/ продукт это приложение, которое выполняет все виды работ. Тем не менее, название продукта является динамическим, и новые постоянно добавляются.

Если маршрут существует, он должен использовать значение по умолчанию:

example.com/about/

example.com/about/shipping

В противном случае это продукт, и он должен перейти к последнему правилу маршрута:

example.com/ndomdynamic название продукта откат}

example.com/laptop

example.com/mouse

example.com/iphone

Я перепробовал запасной вариант, но он никогда не попадает в контроллер продукта и не передает название продукта, которое мне нужно.

 url: "{*.}"

RouteConfig:

      routes.MapRoute(
         name: "Default",
         url: "{controller}/{action}/{id}",
         defaults: new { controller = "About", action = "Index", id = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "Fall Through to Product",
            url: "{productname}/",
            defaults: new { controller = "Product", action = "Index" }
        );

контроллер

 public class ProductController : Controller
 {
    public ActionResult Index(string productname)
    {
        return View();
    }
 }

1 ответ

Решение

Вы не можете на самом деле. Маршрут по умолчанию является маршрутом по умолчанию, потому что он ловит практически все. Тем не менее, что вы можете сделать, это обработать 404, сначала пытаясь найти соответствующий продукт.

В вашем файле Web.config добавьте следующее:

<httpErrors errorMode="Custom" existingResponse="Auto">
  <remove statusCode="404" />
  <error statusCode="404" responseMode="ExecuteURL" path="/error/notfound" />
</httpErrors>

Затем создайте ErrorController:

public ActionResult NotFound()
{
    // Get the requested URI
    var uri = new Uri(Regex.Replace(Request.Url.OriginalString, @"^(.*?);(.*)", "$2"));

    // You slug will be the `AbsolutePath`
    var slug = uri.AbsolutePath.Trim('/');

    // Attempt to find product
    var product = db.Products.SingleOrDefault(m => m.Slug == slug);

    // If no product, return 404 error page
    if (product == null)
    {
        return View("~/Views/404.cshtml");
    }

    // Otherwise, return product view
    Response.StatusCode = 200;
    return View("~/Views/Product/Product.cshtml", product);
}
Другие вопросы по тегам