Перенаправить страницу в методе PartialViewResult () - PullRequest
2 голосов
/ 06 декабря 2011

Привет. Я пытаюсь перенаправить страницу, когда определенное условие не является страницей, используя метод PartialViewResult. Но я не могу этого сделать. Мой код выглядит следующим образом:

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

Ответы [ 4 ]

5 голосов
/ 06 декабря 2011

Предоставленный вами фрагмент кода не будет компилироваться. Вы должны вернуть результат из всех путей кода. Попробуйте что-то вроде этого:

public ActionResult Visit()
{
    int visit = 0;

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

UPDATE:

Полагаю, теперь я понимаю, чего вы пытаетесь достичь. В случае, если запрос 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, а это не то, что вам нужно в этом случае. См. Сообщение в блоге Фила Хаака, в котором объясняется, как можно предотвратить такое поведение ASP.NET, а также можно вернуть несанкционированный ответ 401:

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';
        }
    }
});
2 голосов
/ 19 ноября 2015

Не уверен, что полностью понимаю проблему, но это может кому-то помочь, так как она работает для меня.

else
{
    Response.Redirect("~/default.aspx");
    return null;
}
0 голосов
/ 08 декабря 2011

Вместо использования частичного представления, вам, вероятно, следует рассмотреть использование 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]

0 голосов
/ 06 декабря 2011
else
{
    return RedirectToAction("Index.aspx");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...