Возврат к странице вызова внутри области с помощью 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, но он работает как положено.

Другие вопросы по тегам