即使使用[HttpPost]属性,在控制器动作中仍存在歧义?(ASP.NET MVC4)

3

我有一个“注册”视图(映射到RegisterController),这是一个简单的表单,供用户在我的服务中注册。由于表单的方法是POST,因此我可以通过[HttpPost]属性将控制器的两个动作(显示表单的动作和接收其提交的动作)命名为相同的名称,但区分它们,如下:

open System
open System.Web
open System.Web.Mvc
open System.Net
open System.Threading
open System.Configuration

[<HandleError>]
type RegisterController() =
    inherit Controller()

    member this.Index (guid: string) =
        let model = new RegisterModel(guid)
        this.View("Register", model) :> ActionResult

    [<HttpPost>]
    member this.Index
        (guid: string, password: string, passwordRetry: string) =
            if not (password.Equals(passwordRetry)) then
                raise(new Exception("Passwords must be the same"))
            WebDbAccess.SetNewPassword guid password
            RedirectResult("/") :> ActionResult

这个方法很完美。

然而,我刚刚尝试在我的应用程序的主页视图中使用相同的技术(用于登录功能),但是它不起作用!它抛出了以下错误:

 The current request for action 'Index' on controller type 'HomeController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult Index(System.String, System.String) on type FsWeb.Controllers.HomeController
System.Web.Mvc.ActionResult Index() on type FsWeb.Controllers.HomeController
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Reflection.AmbiguousMatchException: The current request for action 'Index' on controller type 'HomeController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult Index(System.String, System.String) on type FsWeb.Controllers.HomeController
System.Web.Mvc.ActionResult Index() on type FsWeb.Controllers.HomeController

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:


[AmbiguousMatchException: The current request for action 'Index' on controller type 'HomeController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult Index(System.String, System.String) on type FsWeb.Controllers.HomeController
System.Web.Mvc.ActionResult Index() on type FsWeb.Controllers.HomeController]
   System.Web.Mvc.Async.AsyncActionMethodSelector.FindAction(ControllerContext controllerContext, String actionName) +495852
   System.Web.Mvc.Async.ReflectedAsyncControllerDescriptor.FindAction(ControllerContext controllerContext, String actionName) +57
   System.Web.Mvc.ControllerActionInvoker.FindAction(ControllerContext controllerContext, ControllerDescriptor controllerDescriptor, String actionName) +16
   System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +114
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__17(AsyncCallback asyncCallback, Object asyncState) +30
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
   System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) +382
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
   System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +317
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +15
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__2(AsyncCallback asyncCallback, Object asyncState) +71
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +249
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155


Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.17929 

这两种情况有什么区别?我不明白。

HomeController的实现代码如下:

open System
open System.Web
open System.Web.Http

[<HandleError>]
type HomeController() =
    inherit Controller()

    [<HttpGet>]
    member this.Index () =
        this.View() :> ActionResult

    [<HttpPost>]
    member this.Index
        (id:string, password:string) =
            if (UserIsValid id password) then
                RedirectResult("lobby") :> ActionResult
            RedirectResult("loginError") :> ActionResult

你能否尝试使用HttpGet修饰其他Index操作,看看问题是否解决。 - Dismissile
请发布您的HomeController代码以便参考。 - ntombela
@Dismissile:尝试过了,没有成功。 - knocte
2
请确保您使用的是来自System.Web.Mvc命名空间的正确HttpPost属性... - nemesv
1
我猜你的文件中也有一个 open System.Web.Http,它打开了 wep.api 命名空间,并且你使用了 web.apis 的 System.Web.Http.HttpPost 而不是 MVC 的。 - nemesv
显示剩余2条评论
1个回答

3

@nemesv是正确的,我必须使用System.Web.Mvc.HttpPost来完全限定HttpPost,否则它会使用System.Web.Http.HttpPost


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接