.Net MVC Partial View зарежда страницата за вход, когато сесията изтече

Създавам уеб приложение, използвайки .net MVC 4.

Имам ajax форма за редактиране на данни.

въведете описание на изображението тук

Ако потребителят е неактивен за 15 минути, сесията на потребителя ще изтече. Когато това се случи, ако потребителят щракне върху бутона за редактиране, той зарежда страницата за вход в частичното съдържание, следователно текущата сесия изтича.

въведете описание на изображението тук

Редактиране на връзка - 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>

Разбирам защо се случва. Не знам как да го разреша. Искам да го предотвратя и искам да пренасоча потребителя директно към страницата за вход. Как мога да постигна това?

Благодаря предварително..!!!


person yohan.jayarathna    schedule 21.03.2014    source източник


Отговори (6)


Може би хакерски отговор, но можете да промените местоположението на пренасочване при удостоверяване на формуляри на страница, която задава местоположението на прозореца на страницата за вход с javascript.

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

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

Контролер на акаунти

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

Изглед _RedirectToLogin

<script>
    window.location = '@Url.Action("Login", "Account")';
</script>
person kramwens    schedule 29.05.2014
comment
Разбира се, това е малко хак, но е много ефективно (и бързо!). Благодаря. - person Marc; 21.11.2014
comment
Това е страхотен човек. Работи перфектно! Както вие и Марк казахте, нещо като хак, но има ли по-добър начин, на който сте попаднали напоследък? - person Milind Thakkar; 26.04.2016

Проблемът е, че вашето обаждане е прихванато от [Authorize] и изпраща страницата за вход дори преди кодът на вашия метод за действие да бъде извикан. Един от начините да разрешите това е да създадете персонализиран филтър за действие, за да проверите времето за изчакване и да направите твърдо пренасочване към страницата за вход. Следващата публикация съдържа добро описание, което може да ви помогне при създаването и регистрирането на филтъра

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

Късмет

person Chintana Meegamarachchi    schedule 21.03.2014
comment
проверете секцията за коментари на тази статия. Горното решение се проваля, когато сесията изтече и някой поиска ajax заявка. :( - person yohan.jayarathna; 17.04.2014
comment
Този отговор не отговаря на въпроса. - person A.R.; 12.08.2014

Може да искате да проверите отговора на този (подобен) въпрос.

ASP.NET MVC частичен изглед на ajax публикация?

По принцип се казва, че трябва да избягвате да правите ajax извиквания към функции, които могат да пренасочат поради този и други проблеми.

Можете да избегнете проблема, който имате, като разрешите/проверите изтичането ръчно във вашата функция и след това върнете информация за пренасочване, която може да се приложи към цялата страница.

Използвал съм този подход и работи добре.

person A.R.    schedule 11.08.2014

Вдъхновен от отговора на 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>

Това тества текущия window.location и ако не е според очакванията, го задава според очакванията. Знам, моят js е малко хакерски и скапан, но върши работа :)

person cnom    schedule 18.10.2016

Имам прост начин за намиране на сесия за частичен преглед изтекла.

Просто едно действие, създадено след това този изглед Java скрипт windows.load() извикване след това url ще бъде прехвърлен към тази страница за вход.

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

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

Public ActionResult SessionExpire() { return View(); } //Пренасочване към влизане от частичен изглед, след като сесията е нула:

return Redirect("~/OrderPlace/Sessionview");

person kalyani    schedule 24.05.2018

Моето решение е да използвам някакъв c# код, когато е възможно. Мога да получа името на контролера и изгледа, да проверя дали са каквито трябва да бъдат и ако не пренасоча към правилното.

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

След това използвам следното, за да отида до правилния URL адрес:

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