用razor引擎在mvc4中重写url

时间:2014-01-30 08:11:57

标签: asp.net-mvc asp.net-mvc-4 url-rewriting query-string url-rewrite-module

我想重写以下网址 -

http://localhost:99/Product/CategoryLevel?CategoryId=65&ProductName=Vitamins

http://localhost:99/Product/Vitamins

(或)

http://localhost:99/Product/CategoryLevel/Vitamins

(或)

http://localhost:99/Vitamins

(或)如何从url中删除(或)隐藏查询字符串(显示给用户)?

我尝试使用url重写模块(iis)和asp.net路由并在互联网上搜索解决方案,但我没有找到正确的解决方案,请提出任何解决方案。

3 个答案:

答案 0 :(得分:8)

您必须在之前映射所有其他路线映射(路线按顺序评估):

routes.MapRoute(
  name: "Product", // any name meaningful for you is right
  url: "Product/{productName}",
   defaults: new { controller = "Product", action = "CategoryLevel" }
);

此路由将捕获所有看起来像这样的URL:

http://myserver/Product/X
无论X是什么。如果您这样做,您的操作应如下所示:

public ActionResult CategoryLevel(string productName)

注意:参数名称必须与路线映射中的段匹配:productName

因此,只要用户输入:

http://myserver/Product/Vitamins

行动CategoryLevel将被执行,它将收到productName参数,其值为"Vitamins"

问题是如果你有一个你期望被调用的动作List

http://myserver/Product/List

路线将对其进行映射,并使用CategoryLevel = productName

调用"List"操作

为避免这种情况,您可以使用以下路线:

routes.MapRoute(
  name: "Product", // any name meaningful for you is right
  url: "ViewProduct/{productName}",
   defaults: new { controller = "Product", action = "CategoryLevel" }
);

哪个会与其他人不同,任何事情都可以正常运作。特定于此方法的URL将如下所示:

http://myserver/ViewProduct/TheProductName

,其他路线将按预期工作。

顺便说一句:您应该对产品执行特定操作,例如View,而不是CategoryLevel。因此,路线和行动将如下所示:

    routes.MapRoute(
        name: "ViewProduct", // any name meaningful for you is right
        url: "ViewProduct/{productName}",
        defaults: new { controller = "Product", action = "View" }
    );

产品控制器内的操作:

public ActionResult View(string productName)

该路由既用于将用户键入的URL映射到相应的操作,也用于使用某些MVC帮助程序(如Html.ActionLinkUrl.Action)生成URL。所以,如果你做这样的事情:

Url.Action('View', 'Product', new {productName = "Vitamins"} )

您将获得预期的短网址:

http://myserver/ViewProduct/Vitamins

即。路线图是一个双向地图,可以将URL映射到动作,反之亦然。

答案 1 :(得分:0)

你可以使用url重写中间件,我用这个来解决我的问题 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/url-rewriting?tabs=aspnetcore2x

答案 2 :(得分:-2)

您需要修改AppData > RouteConfig.cs

在那里添加下一行代码(默认值下方)

        routes.MapRoute(
            name: "[Choose a name]",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Product", action = "CategoryLevel", id = UrlParameter.Optional }
        );

您的Controller操作应该是以下

public ActionResult CategoryLevel(string ID)
{
}