【问题标题】:MVC Routing - Parameter names questionMVC 路由 - 参数名称问题
【发布时间】:2010-09-25 12:16:02
【问题描述】:

我正在寻找一些关于使用 C# 在 MVC 中进行路由的信息。我目前非常了解 MVC 中路由的基础知识,但我正在寻找的东西有点难以找到。

实际上,我想找到一种定义采用单个参数的单个路由的方法。

我在网上找到的常见示例都是基于示例的

routes.MapRoute(
    "Default",
    "{controller}.mvc/{action}/{id}"
    new { controller = "Default", action="Index", id=""});

通过映射这个路由,你可以映射到任何控制器中的任何动作,但是如果你想向动作传递任何东西,方法参数必须叫“id”。如果可能的话,我想找到一种解决方法,这样我就不必为了在我的操作中使用不同的参数名称而不断地指定路由。

有没有人有任何想法,或找到解决方法?

【问题讨论】:

    标签: c# asp.net-mvc model-view-controller routing url-routing


    【解决方案1】:

    您可以根据需要构建路线

    routes.MapRoute(
        "Default",
        "{controller}.mvc/{action}/{param1}/{param2}/{param3}"
        new { controller = "Default", action="Index", param1="", param2="", param3=""});
    

    另外,look at this post,它包含 cmets 部分中的所有样本

    【讨论】:

    • 有点没抓住重点......他基本上想要 {controller}.mvc/{action}/{*} ,其中 star 是任何参数名称。
    • 是的,谢谢蒂莫西。这是正确的。也许我没有很好地表达这个问题。
    • 不确定你想要什么,也许你可以尝试使用 For Each value In requestContext.RouteData.Values 然后他们查询 value.Key 和 值.值
    【解决方案2】:

    我认为你不能完全按照你的要求去做。当 MVC 调用一个动作时,它会在路由、请求参数和查询字符串中查找参数。它总是在寻找匹配参数名称。

    也许好的旧查询字符串会满足您的需求。

    ~/mycontroller/myaction/?foobar=123
    

    将 123 传递给此操作:

    public ActionResult MyAction(int? foobar)
    

    【讨论】:

      【解决方案3】:

      我知道这是几个世纪以前的事了,但希望它仍然对某人有所帮助。我之前问过同样的问题。我想这就是你要找的。从我的问题帖子中引用的答案: “{*pathInfo} 位称为 slug。它基本上是一个通配符,表示“此点之后的所有内容都填充到一个名为 pathInfo 的参数中”。因此,如果您有“{resource}.axd/{*pathInfo}”和一个 url像这样:http://blah/foo.axd/foo/bar/baz/bing 然后创建两个参数,一个称为资源,其中包含 foo,另一个称为 pathInfo,其中包含 foo/bar/baz/bing。”

      【讨论】:

      • 不是这个问题的真正答案,而是为 *-option +1
      【解决方案4】:

      如果你想拥有不同的参数名称​​并且保持相同的路由变量,使用 FromUri 属性,如下所示:

      public ActionResult MyView([FromUri(Name = "id")] string parameterThatMapsToId)
      {
         // do stuff
      }
      

      在您的路线中,您只需要:

      routes.MapRoute(
        "Default",
        "{controller}.mvc/{action}/{id}"
        new { controller = "Default", action="Index", id=""});
      

      【讨论】:

      • 那不是仅适用于 Web API,不适用于 MVC 吗?
      • @SilverlightFox 你是对的,不幸的是,这只是 web api。看起来 mvc 5 具有属性路由,这可能会有所帮助。
      【解决方案5】:

      虽然您仍然不能使用FromUri 属性,但是您可以使用Route 属性,就像这样

      [Route("~/Policy/PriorAddressDelete/{sequence}")]
      public ActionResult PriorAddressDelete(int sequence)
      {
        Policy.RemoveScheduledPriorAddressItem(sequence);
        return RedirectToAction("Information", new { id = Policy.Id });
      }
      

      从技术上讲,这增加了一条新路线,但至少它不会弄乱您的routeconfig。它将路线定义放在使用它的位置,这是我喜欢的(少找东西)。

      请记住,为了使用属性路由,这必须在您的 routeconfig 文件中您定义的路由中:

      routes.MapMvcAttributeRoutes();
      

      【讨论】:

        猜你喜欢
        • 2017-05-27
        • 2023-03-14
        • 1970-01-01
        • 2023-01-25
        • 1970-01-01
        • 2011-01-07
        • 2019-10-15
        • 2017-09-07
        • 2018-03-24
        相关资源
        最近更新 更多