.Net MVC Partial View загружает страницу входа в систему при завершении сеанса

Я создаю веб-приложение с использованием .net MVC 4.

У меня есть форма ajax для редактирования данных.

enter image description here

Если пользователь простаивает в течение 15 минут, он истекает с сеансом пользователя. Когда это произойдет, если пользователь нажмет кнопку "Редактировать", он загрузит страницу входа в частичный контент, поэтому теперь истекает текущий сеанс.

enter image description here

Изменить ссылку - код cshtml

@Ajax.ActionLink("Edit", MVC.Admin.Material.ActionNames.TagEditorPanel, MVC.Admin.Material.Name, new { isView = "false", id = Model.ID.ToString() }, new AjaxOptions { HttpMethod = "GET", UpdateTargetId = "materialTagBox", InsertionMode = InsertionMode.Replace }, new { @class = "editlinks" })

Контроллер/Код действия

[Authorize]
public virtual ActionResult TagEditorPanel(bool isView, int id)
{
   //do something
   return PartialView(MVC.Admin.Material.Views._tag, response);
}

Web.config

<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

Я понимаю, почему это происходит. Я не знаю, как это решить. Я хочу предотвратить это, и я хочу напрямую перенаправить пользователя на страницу входа. Как я могу достичь этого?

Спасибо в благодарность..!!!

Ответ 1

Может быть, хакерский ответ, но вы можете изменить местоположение перенаправления при проверке подлинности форм на страницу, которая устанавливает местоположение окна на страницу входа в систему с помощью javascript.

Веб-конфигурация

<authentication mode="Forms">
  <forms loginUrl="~/Account/RedirectToLogin" timeout="2880" />
</authentication>

Контроллер учетных записей

public ActionResult RedirectToLogin()
{
    return PartialView("_RedirectToLogin");
}

_RedirectToLogin View

<script>
    window.location = '@Url.Action("Login", "Account")';
</script>

Ответ 2

Проблема заключается в том, что ваш вызов перехвачен [Authorize] и отправляет страницу входа еще до вызова кода метода действия. Один из способов разобраться в этом состоит в создании настраиваемого фильтра действий для проверки тайм-аута и жесткой переадресации на страницу входа. В следующем сообщении есть хорошая запись, которая может помочь вам в создании и регистрации фильтра.

http://www.codeblockdrive.com/2012/12/mvc-custom-filters-session-timeout.html

Желаем удачи

Ответ 3

Вы можете проверить ответ на этот (аналогичный) вопрос.

ASP.NET MVC Частичный просмотр ajax post?

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

Вы можете избежать возникшей у вас проблемы, разрешив/проверяя истечение вручную в своей функции, а затем возвращая информацию о перенаправлении, которая может быть применена ко всей странице.

Я использовал этот подход, и он работает хорошо.

Ответ 4

Вдохновленный ответом kramwens, можно было бы избежать дополнительного представления RedirectToLogin (и действия контроллера) и просто поместить в исходный вид входа:

<script> 
if (window.location != '@string.Format("{0}://{1}{2}",Request.Url.Scheme, Request.Url.Authority,Url.Content("~/Account/Login"))')
            window.location = '@Url.Action("Login", "Account")';
</script>

Это проверяет текущее окно .location, и если оно не так, как ожидалось, оно устанавливает его как ожидалось. Я знаю, мой js немного взломанный и дерьмовый, но он делает работу:)

Ответ 5

У меня есть простой способ найти для частичного просмотра сессии истек.

Создайте Simple One Action, затем вызов этого скрипта java для windows.load(), после чего URL будет передан на эту страницу входа.

//в контроллере создано одно действие.

<script type="text/javascript">
window.location = '@Url.Action("Login", "LogIn")';
</script>

Ответ 6

Мое решение состоит в том, чтобы по возможности использовать некоторый код на С#. Я могу получить контроллер и посмотреть имя, проверить, какие они должны быть, и если не перенаправить на нужное.

var controllerName = ViewContext.RouteData.GetRequiredString("controller");
var actionName = ViewContext.RouteData.GetRequiredString("action");

Затем я использую следующее для перехода к нужному URL:

if (controllerName != "members" && actionName != "logon")
{
    @{ Response.Redirect("~/Members/Logon");}
}