C# 使用MVC控制器重载

C# 使用MVC控制器重载,c#,asp.net-mvc,asp.net-core,routing,C#,Asp.net Mvc,Asp.net Core,Routing,我有一个同名的操作,一个不需要参数,另一个需要ID,当我尝试浏览我的url时,我得到以下异常 处理请求时发生未处理的异常 AmbiguousActionException:匹配了多个操作。以下 操作与路线数据匹配,并满足所有约束条件: Mailer.Controllers.MailBuilderController.MailBody(Mailer) Mailer.Controllers.MailBuilderController.MailBody(Mailer) 我的邮件生成器控制器 //[Ht

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

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

AmbiguousActionException:匹配了多个操作。以下 操作与路线数据匹配,并满足所有约束条件:

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

我的邮件生成器控制器

//[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);
}

让int为空怎么样

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

为了澄清这一点,如果您使用的是默认路由,那么id很可能被设置为
id=RouteParameter。可选的
,因此本质上这两个操作结果是相同的。

如果它与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 });
}

再想一想,您的实际问题可能是我描述的第二个问题,RoutedData不是对象……是的,问题是他的RedirectToAction使用了大写字母I的“Id”,这在生成url时与实际的小写Id不匹配。您需要
new{id=model.id}
路由生成器才能创建正确的路由。他的post-action是否是同一个名称无关紧要。@Dillon我喜欢null-able-int和只有一个action的想法。但是我得到一个不能转换int的值?尝试调用get body时,将其设置为int。有没有更好的方法来处理这个问题呢?\u mailBuilderService.GetBody(int.Parse(id.ToString())@Pomster try id.Value?@Dillon-我已经删除了否决票,因为你删除了不准确的信息。是的,他的帖子已经注释掉了这些路线,但是他说当他取消注释这些路线时,他就有了路线问题。所以“模棱两可”的问题是因为他没有路由,而路由问题是因为他创建了错误的路由数据项。@ErikFunkenbusch您是对的,因为他们注释掉了,他很可能默认为RouteConfig.cs中的模板默认值。我只是为OP中的黄色模糊错误提供了一个解决方案,而正如Michael指出的,实际问题是重定向中的RouteParameters。干杯