我有一个同名操作,一个不希望使用任何参数,另一个不希望使用ID,当我尝试浏览我的网址时,出现以下异常。


  处理请求时发生未处理的异常。
  
  AmbiguousActionException:多个动作匹配。下列
  动作与路线数据匹配,并且满足所有约束:
  
  Mailer.Controllers.MailBuilderController.MailBody(邮件程序)
  Mailer.Controllers.MailBuilderController.MailBody(邮件程序)


我的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);
}


如果我删除上面的评论,则可以导航,但无法通过以下方法重定向至操作。

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

最佳答案

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

此外,路由器还可以找到您需要提供路由数据作为对象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 });
}

08-28 10:39