【问题标题】:Retrieve QueryString And Force Custom Url To A Page检索 QueryString 并强制自定义 URL 到页面
【发布时间】:2017-01-29 05:13:55
【问题描述】:

我正在尝试在 RouteConfig.cs 文件中配置自定义 url,如下所示:

 public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

        routes.MapRoute( 
            name: "Default2",
            url: "{controller}/{action}/id/{id}", //Custom url route
            defaults: new { controller = "Product", action = "AddImages", id = UrlParameter.Optional }
        );
    }

当我在 url 中写下以下内容时,上述工作正常:1st routing

http://localhost:1234/Product/AddImages/id/1008

同样,以下也适用:第二次路由

http://localhost:1234/Product/AddImages/1008

但我想强制 url 在地址栏中显示或写入 url 作为特定页面“AddImages”的第一个,如下所示:http://localhost:1234/Product/AddImages/id/1008

有什么办法可以做到,我的意思是保持默认路由,对于特定页面,第一个路由选项?

我再次尝试从第一个 url 中检索 QueryString,如下所示:

int id = Convert.ToInt32(Url.RequestContext.RouteData.Values["id"]); //This works for the second routing option 

它说 - 输入字符串的格式不正确。我猜,这是默认路由选项,因为它被配置为:

 url: "{controller}/{action}/{id}"

再次,是否可以从以下 url 获取 QueryString 值或进行任何配置:

http://localhost:1234/Product/AddImages/id/1008

【问题讨论】:

  • 您的路线顺序错误 - Default2 必须排在第一位(Default 之前)
  • @Stephen Muecke 我能够通过订购路由来解决。感谢您和无脑程序员的想法。

标签: c# asp.net-mvc url routes


【解决方案1】:

在 MVC 的路由表中,首先定义的路由具有最高优先级。因此,您所需要的只是确保您的特定路线的优先级高于默认路线。早点定义就好了。就是这样 - 正如评论中提到的那样。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute( 
        name: "Default2",
        url: "{controller}/{action}/id/{id}", //Custom url route
        defaults: new { controller = "Product", action = "AddImages", id = UrlParameter.Optional }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

如果您只想要第一个,请尝试删除通用的

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute( 
        name: "Default2",
        url: "{controller}/{action}/id/{id}", //Custom url route
        defaults: new { controller = "Product", action = "AddImages", id = UrlParameter.Optional }
    );
}

如果你只想要那个控制器只试试这个 -

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute( 
        name: "Default2",
        url: "Product/{action}/id/{id}", //Custom url route
        defaults: new { action = "AddImages", id = UrlParameter.Optional },
        constraints: new { controller = "Product" }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

有更好的方法来获取 url 参数。而不是

int id = Convert.ToInt32(Url.RequestContext.RouteData.Values["id"]); //

试试这个 -

int id = Convert.ToInt32(Request.Params["id"]); //

但是如果你正确定义了你的动作方法,你甚至不需要从请求中读取它。它会自动映射。

【讨论】:

  • 无脑程序员!感谢您的解决方案。我无法像这样从查询字符串中获取值:/AddImages/id/2。但它适用于此:/AddImages/2。有什么方法可以获取自定义 url 值?我尝试了您的解决方案,但没有奏效,我的意思是没有获得价值。顺便说一句,约束不会强制控制器使用特定的 url。有什么要配置的吗?
  • @AT-2016 不记得了,很久没用显式路由了,我一般用属性路由,我会测试更新答案的。
  • 感谢您的回复。我会等待。基本上我愿意从此路由中获取 url 或 QueryString 值:/AddImages/id/2(自定义路由)。我不确定这是否可能。如果是,那么我可以处理剩下的。
  • 我能够解决它。感谢您告知限制。现在我知道了。这就是我所做的并强制使用我喜欢的 url:routes.MapRoute("Default2", "{controller}/{action}/imageId/{id}", new { controller = "Product", action = " AddImages", id = UrlParameter.Optional }, new { id = @"\d+" });
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 2012-10-12
相关资源
最近更新 更多