ASP.NET MVC 当前对于 X 的请求是不明确的

9 浏览
0 Comments

ASP.NET MVC 当前对于 X 的请求是不明确的

尝试登录时,我收到以下异常:

在类型为'Sandbox.Web.Controllers.AccountController'的控制器上,对动作方法'Login'的当前请求存在歧义,可以是以下两个动作方法之一:
类型为'Sandbox.Web.Controllers.AccountController'的'System.Web.Mvc.ActionResult Login()'
类型为'Sandbox.Web.Controllers.AccountController'的'System.Web.Mvc.ActionResult Login(Sandbox.Web.Models.Account.LoginModel)'

我知道这是什么意思,但不明白为什么只有在登录时会收到这个异常。

我的登录代码与其他动作都是类似的构建方式:

public class AccountController : Controller
{
    // 构造函数...
    [AllowAnonymous]
    public ActionResult Login()
    {
       // ...
    }
    [AllowAnonymous]
    [HttpPost]
    public ActionResult Login(LoginModel model)
    {
       // ...
    }
}

我的其他动作都是像这样构建的:

ActionResult Create()
[HttpPost]
ActionResult Create(OrderModel model)
ActionResult Edit(int id)
[HttpPost]
ActionResult Edit(OrderModel model)

它们都可以正常工作,没有问题。

我在一个MVC 5.2.7应用程序中使用Autofac 4.9和Autofac.Integration.Mvc (4.0)。

我所改变的唯一部分是默认的MVC模板中的依赖解析器:

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

如果我在Login()之前加上[HttpGet],一切都能正常工作。

有人对如何使其正常工作或为什么不起作用有任何想法吗?

0
0 Comments

当您请求登录页面时,这是一个Get请求,目前只有1个可能的方法,因为另一个方法被标记为HttpPost。因此,请求登录页面是非二义性的。

当您提交登录表单时,这将变成一个Post请求。由于有一个标记为HttpPost的方法和一个未标记为NonAction的公共方法,因此这两个方法都可以负责回答该请求。这是一个二义性的,代码不知道该调用哪个方法。

将HttpGet添加到第一个方法中可以解决此问题,因为当您发送Post请求时,第一个方法不再被视为候选方法。

那为什么我的Create和Edit操作可以工作呢?我只指定了[HttpPost],它就可以工作。

编辑操作之所以可以工作是因为它有一个非空参数,这使得它成为唯一的url和方法组合,而创建操作没有显示所有代码。它也是公共的吗?

是的,它们都是公共的。如果我删除[AllowAnonymous],一切都能正常工作(只要我不为所有路由启用授权)。我会检查我的Autofac配置。也许那就是问题所在。

0