Как создать представление, которое не доступно напрямую, но может быть перенаправлено только на? - PullRequest
1 голос
/ 16 апреля 2009

В настоящее время я работаю над регистрацией пользователей в моем проекте. После завершения регистрации я хочу показать пользователю подтверждение. Я решил создать другой вид. Это нормально.

Теперь, если после регистрации я просто возвращаю вид:

public class MyController : Controller
{
    [AcceptVerbs (HttpVerbs.Post), ValidateAntiForgeryToken]
    public ActionResult Registration (FormCollection form)
    {
        /* Some logic goes here */

        return View ("ConfirmationView");
    }
}

Все работает как нужно. Без изменения URL в строке заголовка. Но ... Если я нажму кнопку обновления, браузер снова отправит данные из формы, которые мне не нужны.

Тогда я решил создать отдельное действие, но это означает, что оно создаст новый URL в адресной строке. Я не хочу, чтобы пользователь теперь нажимал кнопку «Обновить», потому что это представление не сможет снова отобразить подтверждающую информацию. Есть ли способ сделать действие недоступным напрямую? Или хотя бы каким-то образом определить, был ли он вызван напрямую или путем перенаправления? В последнем случае я бы просто убрал пользователя с этой страницы, возможно, на домашнюю страницу.

Есть ли способ сделать это?

Ответы [ 3 ]

3 голосов
/ 16 апреля 2009

Так что я сам нашел решение.

Можно использовать TempData для обнаружения повторных вызовов или вызовов внешнего действия.

public class MyController : Controller
{
    [AcceptVerbs (HttpVerbs.Post), ValidateAntiForgeryToken]
    public ActionResult Registration (FormCollection form)
    {
        /* Some logic goes here */

        TempData["RedirectCall"] = true;
        return RedirectToAction ("Confirmation");
    }

    [AcceptVerbs (HttpVerbs.Get)]
    public ActionResult Confirmation ()
    {
        if (TempData["RedirectCall"] == null)
            return RedirectToAction ("StartPage", "Home");

        return View ();
    }
}

Красиво и просто. :)

0 голосов
/ 27 мая 2015
if(Request.UrlReferrer == null)
{
    return RedirectToAction("Index");
}
0 голосов
/ 16 апреля 2009

Одним из способов решения вашей проблемы является присоединение guid или подобного типа «случайных» данных к пользовательскому сеансу и проверка правильности сеанса при запросе страницы. Если его нет, вы перенаправляете на страницу, где говорится, что этот URL-адрес в данный момент недоступен, и что пользователь скоро будет перенаправлен (а затем через 5 секунд перенаправлен на домашнюю страницу, используя js).

Примерно так будет работать:

  1. Когда пользователь зарегистрирован, файл cookie сеанса создается, например, с GUID. GUID также хранится в таблице базы данных, в которой у вас есть один столбец для первичного ключа UserID и один для GUID. Вы также создаете файл cookie для аутентификации, тем самым регистрируя пользователя на своем сайте.

  2. Когда все вызовы данных и т. Д. Выполнены, пользователь успешно зарегистрирован и т. Д., Вы перенаправляете на страницу подтверждения.

  3. Когда страница подтверждения загружается, пользователь автоматически входит в систему (поскольку вы создали файл cookie аутентификации на шаге 1). Затем вы можете проверить строку в таблице UserID-GUID, соответствующую зарегистрированному пользователю.

    a) Если есть такая строка, вы удаляете строку и отображаете страницу подтверждения со всей информацией.

    б) Если такой строки нет, вы выводите сообщение об ошибке и перенаправляете. Когда вы удалили строку, когда показывали сообщение в первый раз, пользователь больше не сможет получить доступ к странице подтверждения.


Примечание. Если вы используете этот подход (или какой-либо другой, который делает страницу подтверждения доступной только один раз), вы должны убедиться, что на странице подтверждения четко указано, что пользователь больше не сможет получить доступ к этой странице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...