.net mvc ajax重定向,ASP.NET MVC 4中的jQuery Ajax调用后的服务器端重定向

我将登录信息从jQuery AJAX调用发送到MVC 4控制器:

$.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");

}

});

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

[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.

}

}

但是有问题:

如果此方法返回'ActionResult',那么我将收到错误not all code paths return a value。

如果我使用" void",则无法返回任何内容。

即使我使用没有返回值的" void",由于jQuery AJAX调用的异步特性,我也无法重定向到其他控制器或视图。

有什么技术可以处理这种情况?

您是否考虑过尝试在ActionResult的其他内容中返回某些内容?

在else中返回"成功"。

@Jasen,您没有仔细阅读问题。

怎么会这样? 从控制器返回内容并捕获javascript中的响应即可解决问题1和2。您接受的答案本质上是相同的。

@Jasen,如果您有比公认答案更好的东西,请告诉我们。

return通常从方法返回而不执行任何其他语句,因此不需要else部分。这样,您将摆脱问题#1。

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

[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中:

$.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;

}

});

简直很棒。+1。

okey:D,我如何使用这种相同的方法从js /服务器端实现重定向到带有模型的视图?

这对我有帮助。

return JavaScript("window.location = '/'");

参考。链接

如何获得ASP.NET MVC Ajax响应以重定向到新页面...

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

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

服务器端:

protected override void HandleUnauthorizedRequest(AuthorizationContext context)

{

if (context.RequestContext.HttpContext.Request.IsAjaxRequest())

{

var result = new ContentResult {Content ="NOAUTH"};

context.Result = result;

return;

}

}

然后在客户端:

$.ajaxSetup({

dataFilter: function (data, type) {

if (data !=="" && data ==="NOAUTH") {

window.location = '/';

}

return data;

}

});

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

服务器端:

HttpContext.Current.Response.AddHeader("NOAUTH","1");

客户端:

$.ajaxSetup({

complete: function (jqXHR, textStatus) {

if (jqXHR.getResponseHeader("NOAUTH") === '1')

window.location = '/';

}

});

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值