3

我有这个链接

@Ajax.ActionLink("comment", "CreateDebateComment", new { id = Model.DebateID}, new AjaxOptions
{
    UpdateTargetId = "comment-entry-box",
    InsertionMode = InsertionMode.Replace,
    HttpMethod = "GET"
});

哪个触发了这个控制器

  [Authorize]
    public PartialViewResult CreateDebateComment(int id)
    {


            DebateIDForComment = id;
            return PartialView("_CreateDebateCommentPartial");

    }

如果用户未登录,他们会被重定向到登录页面,但它会加载到评论输入框 div 中,而不是重定向到登录页面

我也尝试过这种变化

 public PartialViewResult CreateDebateComment(int id)
    {
        if (!User.Identity.IsAuthenticated)
        {
            RedirectToAction("LogOn", "Account");
        }

            DebateIDForComment = id;
            return PartialView("_CreateDebateCommentPartial");

    }

但它不会重定向,仍然会加载 partialView

有谁知道我怎样才能让它按我的意愿运行?我需要登录页面正常加载,而不是在评论输入框中。

4

2 回答 2

1

如果不使用 [Authorize] (我意识到这是问题)您检查代码中的授权(例如!User.Identity.IsAuthenticated)并将您的响应包装在 json 中,false客户端的 a 重定向到登录 [通过 javascript]

True后面是要显示的数据

IE

{ "Success": "false" }

或者

{ "Success": "true", "data": "blah blah blah" }
于 2012-04-09T03:16:15.493 回答
1

您可以查看以下博客文章,其中 Phil Haack 解释了如果请求是 AJAX 请求,您如何禁止表单身份验证模块重定向到登录页面并返回可能被拦截的 401 HTTP 状态代码客户端并相应地重定向。

因此,要么添加他展示的 HttpModule,要么将他的 NuGet 包安装到您的项目中,然后您所要做的就是注册一个全局 ajax 事件,每次页面上的某些 AJAX 请求从服务器命中 401 时都会触发该事件:

<script type="text/javascript">
    $.ajaxSetup({
        statusCode: {
            401: function () {
                window.location.href = '@Url.Action("logon", "account")';
            }
        }
    });
</script>
于 2012-04-09T06:32:22.267 回答