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