用razor引擎在mvc4中重写url

use*_*404 4 asp.net-mvc url-rewriting query-string asp.net-mvc-4 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路由并在互联网上搜索解决方案,但我没有找到正确的解决方案,请建议任何解决方案.

Jot*_*aBe 8

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

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

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

http://myserver/Product/X
Run Code Online (Sandbox Code Playgroud)

无论X是什么.如果您这样做,您的操作应如下所示:

public ActionResult CategoryLevel(string productName)
Run Code Online (Sandbox Code Playgroud)

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

因此,每当用户输入:

http://myserver/Product/Vitamins
Run Code Online (Sandbox Code Playgroud)

该动作CategoryLevel将被执行,它将接收productName带有该值的参数"Vitamins"

问题是如果你有一个List你希望像这样调用的动作

http://myserver/Product/List
Run Code Online (Sandbox Code Playgroud)

路由将映射它并将CategoryLevel使用productName= 调用操作"List"

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

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

这将与其他人不同,任何事情都可以正常工作.特定于此方法的URL将如下所示:

http://myserver/ViewProduct/TheProductName
Run Code Online (Sandbox Code Playgroud)

其他路线将按预期工作.

顺便说一句:您应该对产品进行特定操作,例如View,而不是CategoryLevel.所以,路线和动作看起来像这样:

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

产品控制器内部的操作:

public ActionResult View(string productName)
Run Code Online (Sandbox Code Playgroud)

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

Url.Action('View', 'Product', new {productName = "Vitamins"} )
Run Code Online (Sandbox Code Playgroud)

你会得到预期的短网址:

http://myserver/ViewProduct/Vitamins
Run Code Online (Sandbox Code Playgroud)

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