【问题标题】:Overloading with MVC Controllers使用 MVC 控制器重载
【发布时间】:2017-11-07 14:16:55
【问题描述】:

我有一个同名的操作,一个不需要参数,另一个需要一个 ID,当我尝试浏览我的 url 时,我得到以下异常。

处理请求时发生未处理的异常。

AmbiguousActionException:匹配多个动作。下列 动作匹配路由数据并满足所有约束:

Mailer.Controllers.MailBuilderController.MailBody (Mailer) Mailer.Controllers.MailBuilderController.MailBody (Mailer)

我的 MailBuilder 控制器。

//[HttpGet("mailbuilder/MailBody")]
public IActionResult MailBody()
{
   Body model = new Body();
   return View(model);
}

//[HttpGet("mailbuilder/MailBody/{id}")]
public IActionResult MailBody(int id)
{
   Body model = _mailBuilderService.GetBody(id);
   return View(model);
}

如果我删除上面的 cmets,我可以导航,但我无法重定向到以下方法中的操作。

public IActionResult SaveBody(Body model)
{
  _mailBuilderService.AddBody(model);
  return RedirectToAction("MailBody", model.Id);
}

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core routing


    【解决方案1】:

    如果它与之前版本的 MVC 类似,那么您需要取消注释这些路由属性 ([HttpGet("mailbuilder/MailBody/{id}")]),但还需要将您的 post 操作重命名为相同的名称。或者,您可以在表单助手中设置操作(如果仍然存在)。

    还可以让路由器找到您需要的正确方法,将路由数据作为对象提供return RedirectToAction("MailBody", new { id = model.Id });

    以下代码示例未经测试,但我认为它会走上正轨……

    [HttpGet("mailbuilder/MailBody")]
    public IActionResult MailBody()
    {
       Body model = new Body();
       return View(model);
    }
    
    [HttpGet("mailbuilder/MailBody/{id}")]
    public IActionResult MailBody(int id)
    {
       Body model = _mailBuilderService.GetBody(id);
       return View(model);
    }
    
    [HttpPost("mailbuilder/MailBody")]
    public IActionResult MailBody(Body model)
    {
      _mailBuilderService.AddBody(model);
      return RedirectToAction("MailBody", new { id = model.Id });
    }
    

    【讨论】:

    • 再想一想-您的实际问题可能是我描述的第二个问题,因为 routedata 不是对象...
    • 是的,问题是他的RedirectToAction使用的是“Id”,大写的I,生成url时与实际小写的id不匹配。您需要new { id = model.Id } 来让路线生成器创建正确的路线。他的帖子操作是否同名无关紧要。
    【解决方案2】:

    如何让 int 可以为空?

    public IActionResult MailBody(int? id)
    {
       Body model = id.HasValue ? _mailBuilderService.GetBody(id.Value) : new Body();
       return View(model);
    }
    

    澄清一下,如果您使用默认路由,则 id 可能设置为id = RouteParameter.Optional,因此本质上这两个 ActionResult 是相同的。

    【讨论】:

    • @Dillon 我喜欢可以为空的 int 并且只有一个动作的想法。但是我得到一个无法转换的整数?在尝试调用 get body 时转换为 int。有没有更好的方法来处理这个然后 _mailBuilderService.GetBody(int.Parse(id.ToString()))
    • @Pomster 试试 id.Value?
    • @Dillon - 我删除了反对票,因为您删除了不准确的信息。是的,他的帖子已将路线注释掉,但他说当他取消这些路线时,他遇到了路线问题。所以“模棱两可”的问题是因为他没有路由,而路由问题是因为他创建了错误的路由数据项。
    • @ErikFunkenbusch 你是对的,因为他们被注释掉了,他很可能默认使用 RouteConfig.cs 中的模板默认值。我只是为 OP 中的大黄色模糊错误提供了一个解决方案,而正如 Michael 指出的那样,实际问题在于重定向中的 RouteParameters。干杯。
    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多