我收到错误
以下操作方法之间的当前请求不明确: 类型上的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并且参数不同时,为什么会出现歧义?
答案 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
的动态值,那么您可以摆脱Foo1
和Foo2
操作,只需拥有一个动作:
[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>
我认为应该这样做。