【问题标题】:Ambiguous Actions模棱两可的行动
【发布时间】:2011-01-09 03:05:30
【问题描述】:

有没有办法让多个动作具有不同的参数?我已经看到它使用HttpPost 动词标志,但它似乎在其他地方对我不起作用。

当前对控制器类型 FoldersController` 的操作 List 的请求在以下操作方法之间不明确。

public ActionResult List()
{ 
 //... 
}

public ActionResult List(DateTime start)
{
 // ...
}

public ActionResult List(string key)
{
 // ....
}

尝试我在...上找到的这个 Route 参数

我仍然对路由的工作方式有些困惑。这就是我到目前为止所拥有的。 ASP.NET MVC Routing Via Method Attributes

但我仍然得到模棱两可的错误。这对我来说没有多大意义——它们是两条完全不同的路线——它应该确切地知道要调用哪个 ActionResult。但它并没有这样做......

    [UrlRoute(Path = "List/Days/{days}")]
    [UrlRouteParameterConstraint(Name = "days", Regex = @"\d+")]
    public PartialViewResult List(int days)
    {
        return PartialView("List", Folders.List());
    }

    [UrlRoute(Path = "List/Rings/{ring}")]
    [UrlRouteParameterDefault(Name = "ring", Value = "all")]
    public PartialViewResult List(string ring)
    {
        return PartialView("List", Folders.List());
    }

【问题讨论】:

  • 关于 UrlRoute 的东西 1) 不喜欢它 2) 你是在调用库提供的路由注册东西吗(这会解释它不起作用)?
  • // 从它们的属性中注册任何其他路由。 RouteUtility.RegisterUrlRoutesFromAttributes(routes);在 global.asax 文件中。
  • 我不确定您所说的“调用库提供的路由注册内容”是什么意思。我试图弄清楚如何直接从 registerroutes 方法映射路线,只是到达那里的过程很慢......
  • 在你链接的东西中,有一个 RouteUtility.RegisterUrlRoutesFromAttributes(routes); - 只是检查被称为 UrlRoute 属性的东西没有它就没有任何意义[这将解释行为没有变化]。
  • 那么你有那个了,那两条路线还没有被接上?您是否已将已注册的路线转出以查看它们是否确实在其中?

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


【解决方案1】:

您需要为请求路由机制提供足够的信息,以便能够明确地选择应用哪一个,例如,通过在路由注册中提供正则表达式模式并将某些请求过滤到您的另一个操作中'打电话给ListByDate

但一般来说,如果程序开始变得混乱,使用起来就会感到困惑:- http://odetocode.com/Blogs/scott/archive/2010/01/25/kiss-your-asp-net-mvc-routes.aspx

因此,另一种避免编造正则表达式以通过正则表达式消除日期与“其他所有”操作的歧义的方法是制定路由方案:-

  • /按日期/yy-mm-dd
  • /按键/按键

【讨论】:

  • 我不确定你的意思。如何使用正则表达式将其指向适当的方法?
  • @Stacey。在您的routes.MapRoute 中,您将添加action="ListByDate",然后将您的操作重命名为该名称或在其上添加一个属性以显示“我实现了该操作别名”。但是您需要有一个与 DateTime [model] 绑定正常工作方式相匹配的正则表达式,这很难干净地完成。
  • 类似的事情会是明智的吗? stackoverflow.com/questions/894779/…
  • 我个人不喜欢您链接到的问题中的内容。你那里有那个库和对它的调用吗?在一天结束时,这不会产生您正在寻找的歧义(如果它看起来像一个日期,请调用这个,否则调用另一个)。请注意,您也可以使用模型绑定器来做一些技巧,但所有这些都远非简单。
  • 对我来说,拥有一个方法并传递不同的参数,或者通过不同的路径到达它,比为类似的任务创建 3 或 4 个不同的命名方法要简单得多。
【解决方案2】:

由于您没有设置AcceptVerbs,它无法确定调用哪个方法。你能澄清一下“它在其他地方似乎对我不起作用”吗?

【讨论】:

  • 英文确实有歧义。我将该声明解释为试图说“我知道您可以使用 AcceptVerb 来消除歧义,这通常很好。在这种情况下它没有帮助 [因为我想将两者都绑定到 GET]”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 2020-12-08
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
相关资源
最近更新 更多