2017-06-06 75 views
2

我有一个相同的名称的行动,一个预计没有参数,另一个期待一个ID,当我尝试浏览我的网址我得到以下异常。与MVC控制器重载

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

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

回答

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

是的,问题是他的RedirectToAction正在使用“Id”与大写I,它将不匹配实际生成url时使用小写的id。您需要'new {id = model.Id}'为路由生成器创建正确的路由。他的帖子行为是否是同一个名字是无关紧要的。 –

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是相同的。

+0

@Dillon我喜欢无效int的想法,只有一个动作。不过,我得到一个不能转换int?在尝试调用get body时返回int。有没有更好的方式来处理这个然后_mailBuilderService.GetBody(int.Parse(id.ToString())) – Pomster

+1

@Pomster尝试id.Value? – Dillon

+0

@Dillon谢谢!!! – Pomster