使用MVC控制器进行重载

时间:2017-06-06 14:00:45

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

我有一个同名的动作,一个期望没有参数而另一个期望一个ID,当我尝试浏览我的网址时,我得到以下异常。

  

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

     

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

     

Mailer.Controllers.MailBuilderController.MailBody(Mailer)   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);
}

2 个答案:

答案 0 :(得分:2)

如果它与之前版本的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 });
}

答案 1 :(得分:1)

如何使int可以为空?

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

澄清一下,如果你使用默认路由,那么id可能设置为id = RouteParameter.Optional,所以本质上两个ActionResults是相同的。