在PartialViewResult()方法中重定向页面

时间:2011-12-06 15:03:14

标签: c# .net asp.net-mvc-2

您好我正在尝试使用PartialViewResult方法在某个条件不是页面时重定向页面。但我无法做到。我的代码如下:

public PartialViewResult Visit()
{    
    int visit = 0;
    if (base.IsLoggedIn() == true)
    {
        visit++;
    }
    else
    {
        // toDO redirect to home/index page
    }
}

4 个答案:

答案 0 :(得分:5)

您提供的代码段无法编译。您必须从所有代码路径返回结果。尝试这样的事情:

public ActionResult Visit()
{
    int visit = 0;

    if (base.IsLoggedIn() == true)
    {
        visit++;
        return PartialView();
    }
    else
    {
        return RedirectToAction("ACTION_NAME_GOES_HERE");
    }
}

<强>更新

我相信我现在明白你想要完成的事情。如果未登录的用户发出ajax请求,您希望浏览器重定向用户。我建议修改你的动作方法如下:

public ActionResult Visit()
{
    int visit = 0;

    if (base.IsLoggedIn())
    {
        visit++;
        // whatever else needs to be done
        return PartialView();
    }
    else
    {
        // Note that this could be done using the Authorize ActionFilter, using
        // an overriden Authorize ActionFilter, or by overriding OnAuthorize().
        if (!base.IsLoggedIn())
            return new HttpUnauthorizedResult();
    }
}

假设您已在web.config中配置,响应将是302重定向,这不是您在此方案中所需的。请参阅Phil Haack的博客文章,其中解释了如何防止此ASP.NET行为并返回401 Unauthorized响应:

http://haacked.com/archive/2011/10/04/prevent-forms-authentication-login-page-redirect-when-you-donrsquot-want.aspx

然后,假设您正在使用jQuery发出AJAX请求,您可以处理401响应:

$.ajax({
    url: '/your_controller/visit',
    type: 'GET',
    statusCode: {
        200: function (data) {
            // data = your partialview
        },
        401: function (data) {
            location.href = '/the_path/to_redirect/to';
        }
    }
});

答案 1 :(得分:2)

我不确定我是否完全理解这个问题,但这可能对某些人有所帮助。

else
{
    Response.Redirect("~/default.aspx");
    return null;
}

答案 2 :(得分:0)

您应该考虑使用OnActionExecuting或类似视图,而不是使用局部视图,因为这种常见逻辑不属于视图/控制器。例如:

[AttributeUsage(AttributeTargets.All)]
public sealed class RecordLoggedInCountAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    { 
        if (filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            visit++;
        }
        else
        {
            filterContext.HttpContext.Response.Redirect("http://google.com");
        }
    }
}

然后使用[RecordLoggedInCount]

装饰要为其录制的任何控制器/操作

答案 3 :(得分:-2)

else
{
    return RedirectToAction("Index.aspx");
}