MVC路由 - 参数名称问题

时间:2008-12-05 12:09:22

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

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

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

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

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

通过映射此路由,您可以映射到任何控制器中的任何操作,但是如果要将任何内容传递给操作,则必须将方法参数称为“id”。如果可能的话,我想找到解决这个问题的方法,这样我就不必经常指定路由只是为了在我的行动中使用不同的参数名称。

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

5 个答案:

答案 0 :(得分:7)

如果您希望使用不同的参数名保持相同的路由变量,请使用FromUri属性,如下所示:

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

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

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

答案 1 :(得分:5)

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

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

~/mycontroller/myaction/?foobar=123

将123传递给此操作:

public ActionResult MyAction(int? foobar)

答案 2 :(得分:3)

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

答案 3 :(得分:0)

您可以根据需要构建路线

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

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

答案 4 :(得分:0)

虽然您仍然无法使用FromUri属性,但您可以使用Route属性,如此

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

从技术上讲,这会增加一条新路线,但至少它不会使你的routeconfig变得混乱。它将路线定义放在它所使用的位置,我喜欢它(减少狩猎的东西)。

请记住,为了使用属性路由,这必须位于您的路由配置文件上面您定义的路由:

routes.MapMvcAttributeRoutes();