0

在映射到产品控制器的默认路由之后,如何为产品创建直通(回退)路由?

而不是 example.com/product/laptop 我想要 example.com/laptop

/product 是一个可以完成各种工作的应用程序。但是,产品名称是动态的,并且一直在添加新名称。

如果路由存在,那么它应该使用默认值:

example.com/about/

example.com/about/shipping

否则,它是一个产品,并且应该落入最后一条路由规则:

example.com/{动态产品名称后备}

example.com/laptop

example.com/mouse

example.com/iphone

我已经尝试了所有的后备,但它永远不会到达 Product 控制器,并且它没有传递我需要的产品名称。

 url: "{*.}"

路由配置:

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

1 回答 1

0

你真的不能。默认路由是默认路由,因为它几乎可以捕获所有内容。但是,您可以做的是首先尝试找到匹配的产品来处理 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);
}
于 2017-04-17T12:55:46.747 回答