Возврат к странице вызова внутри области с помощью UrlReferrer
Я создал новый проект MVC2, используя веб-приложение ASP.NET MVC2, которое предоставляет мне веб-сайт по умолчанию. Я добавил простую область, в которой у меня был домашний контроллер и индексное представление. Это вызвало первую проблему с компилятором, давшим "найдено несколько типов, которые соответствуют имени контроллера" Home "". Я изменил Home на Main, и он скомпилирован.
Я добавил новую вкладку для ссылки на представление "Индекс" в своей области, открыл веб-сайт и начал щелкать вкладки. Когда я посещал страницу указателя области, я не мог вернуться на страницу "Домой" или "О нас" без изменения меню, как показано ниже:
<ul id="menu">
<li><%= Html.ActionLink("SampleArea.Main", "Index", "Main", new { area = "SampleArea" }, null)%></li>
<li><%= Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)%></li>
<li><%= Html.ActionLink("About", "About", "Home", new { area = "" }, null)%></li>
</ul>
Тогда я мог бы правильно переключаться между вкладками. Затем я изменил код в представлении LogOff в контроллере учетной записи следующим образом:
public ActionResult LogOff()
{
FormsService.SignOut();
//return RedirectToAction("Index", "Home");
return RedirectToAction(Request.UrlReferrer.AbsolutePath.ToString());
}
Я использую UrlReferrer.AbsolutePath, чтобы вернуться на страницу вызова, если пользователь выходит из системы. Если вызывающей страницей является представление в SampleArea,.AbsolutePath содержит "/SampleArea". Это потому, что контроллер и представление являются значениями по умолчанию, и поэтому они не включены. По мере продолжения я получаю следующее сообщение об ошибке:
Этот ресурс не может быть найден.
Описание: HTTP 404. Ресурс, который вы ищете (или одна из его зависимостей), мог быть удален, изменилось его имя или временно недоступен. Пожалуйста, просмотрите следующий URL и убедитесь, что он написан правильно.Запрашиваемый URL: /Account/SampleArea
Насколько я понимаю, / Account был добавлен, потому что это контроллер, в котором он был, когда LogOff был выполнен. Он считает / SampleArea действием и поэтому добавил текущий контроллер для завершения маршрута.
Используя UrlReferrer.AbsolutePath, можно ли как-то указать SampleArea в качестве области или я могу что-то еще сделать, чтобы вернуться на нужную страницу?
Новое дополнение
Это даже страннее, чем я думал. Я открыл веб-сайт, который я сейчас разрабатываю, и изменил оператор return в представлении LogOut, чтобы он возвращался с использованием AbsolutePath. Точка останова показывает, что она содержит "/Club/PrivacyPolicy". Тем не менее, я получаю то же сообщение об ошибке со следующим отличием:
Запрашиваемый URL: / Логин / Клуб / PrivacyPolicy
С какой стати это должно начинаться с префикса /Login, который является View, а не / Account, который является контроллером? На самом деле, зачем ему вообще ставить перед ним префикс? /Club/PrivacyPolicy - это действующий маршрут в Global.asax.cs.
1 ответ
Я наконец понял, как вернуться на страницу, на которой вы находились, когда вызывали запрос LogOn или LogOut. Я использовал следующий кусок кода.
Html.ActionLink("Member LogOn", "LogOn", "Account", new { area = "", returnUrl = HttpContext.Current.Request.RawUrl }, null)
Это генерирует
<a href='/LogIn/LogOn?returnUrl=%2FContactUs'>Member LogOn</a>
например.
В моем HttpPost ActionResult LogOn я тогда
if (!String.IsNullOrEmpty(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
Иногда я нахожу, что мне просто нужен HttpContext.Request.RawUrl.
Я не совсем уверен, почему он сгенерировал /LogIn/LogOn вместо /Account/LogOn, но он работает как положено.