使用字符串参数的属性路由是不明确的

时间:2014-12-09 10:20:11

标签: asp.net-mvc asp.net-mvc-routing

我收到错误

  

以下操作方法之间的当前请求不明确:   类型上的System.Web.Mvc.ActionResult Foo1(System.String)   Project.Web.Controllers.PageController   类型上的System.Web.Mvc.ActionResult Foo2(System.String)   Project.Web.Controllers.PageController

调用ActionResults的a href是

<a href="@Url.Action("Foo1", "Page", new { page = "Foo1" })">Foo1</a>
<a href="@Url.Action("Foo2", "Page", new { page = "Foo2" })">Foo2</a>

我基本上是传递字符串而不是int id(我意识到这不是最好的方法,但这不是我想在这里解决的问题)

这允许我将一个字符串参数添加到Routing for clean urls,所以我的ActionResult现在是

[AllowAnonymous, Route("{page}")]
public ActionResult Foo1(string page)
{
   ...
}

[AllowAnonymous, Route("{page}")]
public ActionResult Foo2(string page)
{
   ...
}

当链接传递给不同的ActionResults并且参数不同时,为什么会出现歧义?

1 个答案:

答案 0 :(得分:1)

您似乎误解了[Route]属性的作用。你的例子肯定是模棱两可的。

此:

[AllowAnonymous, Route("{page}")]

表示“将此操作映射到只有一个且只有一个段的路径,并将该段视为page参数。

所有这些网址:

http://example.com/Foo1
http://example.com/Foo2
http://example.com/SomethingElse

将映射到具有该属性的操作。

如果您对同一路由有两个操作,则MVC框架不知道将URL映射到哪个操作。他们都是有效的候选人。

我认为有一种更简单的方法可以实现您想要做的事情。

在RouteConfig.cs中,添加URL模式中不包含控制器名称的路由映射:

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

为您的操作添加action参数:

[AllowAnonymous]
public ActionResult Foo1(string action)
{
   // action has the value Foo1
   ...
}

and
[AllowAnonymous]
public ActionResult Foo2(string action)
{
   // action has the value Foo2
   ...
}

从链接中删除page内容:

<a href="@Url.Action("Foo1", "Page")">Foo1</a>
<a href="@Url.Action("Foo2", "Page")">Foo2</a>

你应该全力以赴。

<小时/> 修改:如果您只想允许传入page的动态值,那么您可以摆脱Foo1Foo2操作,只需拥有一个动作:

[Route("{page=index}")]
public ActionResult Page(string page)
{
    // page is the value specified in the url
}

对于网站内的链接,只需使用普通的<a>元素:

<a href="/Foo1">To Foo1</a>
<a href="/Foo2">To Foo2</a>

我认为应该这样做。