从APIController操作重定向到其他MVC控制器操作

cur*_*ity 1 c# asp.net-mvc

我创建了一个具有注册操作的Web api控制器:

public class MyProjApiController : ApiController
    {
        public IHttpActionResult Register()
        {
            return  RedirectToAction("Register", "AccountController"); //??
        }
    }
Run Code Online (Sandbox Code Playgroud)

我试图重定向到public class AccountController : Controller具有MVC控制器中的 另一个动作,public async Task<ActionResult> Register(RegVM model)但是我的Register动作MyProjApiController具有IHttpActionResult返回类型,而AccountController中的注册具有Task<ActionResult>类型-如何调用它?

Shy*_*yju 6

我认为您在这里混入两个概念。您的API控制器应具有将从某些客户端调用的终结点,并且您应该以客户端可以读取的格式(XML或JSON)返回一些数据。您不应该重定向到另一个MVC控制器。

您应该做的是返回一些数据,该数据具有客户端可以使用的MVC操作控制器的路径。

public HttpResponseMessage Register()
{
   //DO something as you want 
    var newUrl = this.Url.Link("Default", new { Controller = "Account", 
                                                                   Action = "Register" });
    return Request.CreateResponse(HttpStatusCode.OK,
                                              new {Success = true, RedirectUrl = newUrl});
}
Run Code Online (Sandbox Code Playgroud)

这将向您返回带有200 OK响应状态代码的此类响应给呼叫者

{
   "Success" : true,
   "RedirectUrl" : "yoursite.com/Account/Register"    
}
Run Code Online (Sandbox Code Playgroud)

客户应阅读并做必要的事情。例如,如果要从js代码调用此API,则只需使用window.location.href将用户重定向到新页面即可。

例如 ,

$.post("PathToYourApiEndpoint,function(res){
  if(res.Success)
  {
    window.location.href=res.RedirectUrl;
  }
}); 
Run Code Online (Sandbox Code Playgroud)

同样,我不确定为什么要先调用API并将用户重定向到MVC控制器操作。无论您在Web api操作方法中执行什么逻辑,您都可以在MVC控制器中执行操作,从而避免了API调用。