Создание правила сквозного маршрута после правила по умолчанию
Как создать резервный (резервный) маршрут для продуктов после маршрута по умолчанию, который сопоставляется с контроллером продукта?
Вместо 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);
}