我想重写以下网址 -
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路由并在互联网上搜索解决方案,但我没有找到正确的解决方案,请提出任何解决方案。
答案 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.ActionLink
或Url.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)
{
}