首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >asp.net MVC4中jquery ajax调用后的服务器端重定向

asp.net MVC4中jquery ajax调用后的服务器端重定向
EN

Stack Overflow用户
提问于 2013-11-06 01:33:20
回答 3查看 37.3K关注 0票数 22

我从一个jQuery AJAX调用向一个MVC4控制器发送登录信息:

代码语言:javascript
复制
   $.post(url, data, function (response) {
      if (response=='InvalidLogin') {
          //show invalid login
      }
      else if (response == 'Error') {
          //show error
      }
      else {
          //redirecting to main page from here for the time being.
          window.location.replace("http://localhost:1378/Dashboard/Index");
      }
   });

如果登录成功,我希望根据用户类型将用户从服务器端重定向到相应的页面。如果登录失败,则会将一个字符串发送回user:

代码语言:javascript
复制
    [HttpPost]
    public ActionResult Index(LoginModel loginData)
    {
        if (login fails)
        {
            return Json("InvalidLogin", JsonRequestBehavior.AllowGet);
        }
        else
        {
             // I want to redirect to another controller, view, or action depending
             // on user type.
        }
    }

但也有一些问题:

  1. 如果此方法返回'ActionResult',则我将得到错误not all code paths return a value.
  2. If I use‘’,我无法返回任何内容。
    1. 即使我使用了‘
    2. ’而没有返回,由于jQuery AJAX调用的异步性质,我也无法重定向到其他控制器或视图。

有没有什么技术可以处理这样的场景?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-06 01:50:48

return通常从方法返回,而不执行任何其他语句,因此不需要else部件。这样你就可以摆脱第一个问题了。

至于重定向,为什么不返回某种重定向命令:

代码语言:javascript
复制
[HttpPost]
public ActionResult Index(LoginModel loginData)
{
    if (login fails)
    {
        return Json(new {result = "InvalidLogin"}, JsonRequestBehavior.AllowGet);
    }
    return Json(new {result = "Redirect", url = Url.Action("MyAction", "MyController")});
}

然后在javascript中:

代码语言:javascript
复制
$.post(url, data, function (response) {
  if (response.result == 'InvalidLogin') {
      //show invalid login
  }
  else if (response.result == 'Error') {
      //show error
  }
  else if (response.result == 'Redirect'){
      //redirecting to main page from here for the time being.
      window.location = response.url;
  }
 });
票数 49
EN

Stack Overflow用户

发布于 2016-03-21 19:00:41

这对我有帮助。

代码语言:javascript
复制
return JavaScript("window.location = '/'");

参考链接How to get an ASP.NET MVC Ajax response to redirect to new page...

票数 2
EN

Stack Overflow用户

发布于 2016-10-24 04:06:16

我不得不这样做,但我发现没有一个解决方案真正满足了我对JavaScript解析错误的极端要求,为了将客户端重定向到登录页面,我必须避免这些错误。

我所做的是从我的自定义Authorization属性发送一个简单的"NOAUTH“字符串响应,然后在命中任何事件处理程序之前拦截Ajax响应,并通过设置window.location来重定向用户。

服务器端:

代码语言:javascript
复制
protected override void HandleUnauthorizedRequest(AuthorizationContext context)
{
    if (context.RequestContext.HttpContext.Request.IsAjaxRequest())
    {
        var result = new ContentResult {Content = "NOAUTH"};
        context.Result = result;
        return;
    }
}

然后在客户端:

代码语言:javascript
复制
$.ajaxSetup({
    dataFilter: function (data, type) {
        if (data !== "" && data === "NOAUTH") {
            window.location = '/';
        }
        return data;
    }
});

不过,我不建议使用这种方法。如果您必须这样做,那么我至少建议您将"NOAUTH“值放入http响应头中,然后在全局JQuery complete处理程序中读取该值。

服务器端:

代码语言:javascript
复制
HttpContext.Current.Response.AddHeader("NOAUTH", "1");

客户端:

代码语言:javascript
复制
$.ajaxSetup({
    complete: function (jqXHR, textStatus) {
        if (jqXHR.getResponseHeader("NOAUTH") === '1')
            window.location = '/';
    }
});

请注意,在命中任何其他事件处理程序之前,使用dataFilter是惟一的方法来拦截ajax请求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19795198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档