【问题标题】:url rewriting in mvc4 with razor engine使用剃须刀引擎在mvc4中重写url
【发布时间】:2014-02-22 10:17:02
【问题描述】:

我想重写以下网址 -

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路由并在互联网上搜索解决方案,但我没有找到合适的解决方案,请提出任何解决方案。

【问题讨论】:

  • 路由配置是 'routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "索引", id = UrlParameter.Optional } ); routes.MapRoute(名称:“[clv]”,url:“{controller}/{action}/{id}”,默认值:new { controller = “Product”,action = “CategoryLevel”,id = UrlParameter.Optional } );'

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


【解决方案1】:

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

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

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

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

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 映射到操作,反之亦然。

【讨论】:

  • 它的工作,但我仍然得到这样localhost:99/Product/Vitamins?CategoryId=65,但我不想显示?CategoryId=65,我无法访问下一个级别@JotaBe
  • 你是怎么得到那个错误的 URL 的?如果您不需要该参数,请不要使用它,它将停止出现在 url 中。
  • @JotaBe 这很好。但我不喜欢的是,首先使用这种方法,如果有人调用原始调用 '/Product/CategoryLevel?CategoryId=65&ProductName=Vitamins' 它将不起作用。此外,如果您在该控制器上有一些其他操作,而不是您建议的“列表”,您最终将为每个操作编写一个路由。
  • 我的 mvc4 移动应用程序中的网址:一级:localhost:99/Product/…,二级:localhost:99/Product/…,三级:localhost:99/Product/…
  • routeconfig is routes.MapRoute( name: "Product", // 任何对你有意义的名字都是正确的 url: "Product/{productName}/", 默认值: new { controller = "Product",行动=“类别级别”}); routes.MapRoute( name: "Home", url: "{controller}/{action}", 默认值: new { controller = "Home", action = "Index" } ); @JotaBe
【解决方案2】:

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

【讨论】:

  • 这个问题专门针对非核心的 MVC4...
【解决方案3】:

您需要编辑您的AppData > RouteConfig.cs

在此处添加下一行代码(低于默认值)

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

您的控制器操作应该如下

public ActionResult CategoryLevel(string ID)
{
}

【讨论】:

  • 我使用了这段代码,但 url 仍然是相同的 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = “主页”,动作 = “索引”,id = UrlParameter.Optional }); routes.MapRoute(名称:“[clv]”,url:“{controller}/{action}/{id}”,默认值:new { controller = “Product”,action = “CategoryLevel”,id = UrlParameter.Optional } );@Devcon 2
  • 您是否也更改了控制器中的操作?
  • 是的,公共 ActionResult CategoryLevel(string ID) {-----------------}@Devcon 2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多