RedirectToRoute («по умолчанию») не перенаправляет, вместо этого возвращается HTML-код входа в систему PartialViewResult - PullRequest
0 голосов
/ 26 февраля 2010

Страница аккаунта открывается как обычно:

    public ActionResult Index()
    {            
        return View();
    }

это позволяет отобразить следующий шаблон представления: (потому что на данный момент CurrentUser отсутствует, 'user' равен null, поэтому он запускается Html.RenderAction("LogOn", "Account");)

<% var user = (WAPConfigUser) HttpContext.Current.Session["CurrentUser"]; 
   if (user == null || user.IsLoggedIn == false || user.IsPublic) 
   {
       Html.RenderAction("LogOn", "Account");
   } else { %>

    <span class="PageNavLink">
        <% Html.RenderPartial("AccountMenu"); %>        
    </span>
    <div id="IndexContent" class="IndexContent">
        <% Html.RenderAction("UserList", "Account"); %>    
    </div>

<% } %>

поэтому я ввожу имя пользователя и пароль, и запускается следующий код (и пользователь добавляется в сеанс для последующего восстановления), и меня перенаправляют на нужную мне страницу:

(конкретно return Redirect(redirect);)

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult LogOn(WAPConfigUser user)
    {
        if (!ValidateLogOn(user.UserName, user.Password))
        {
            return PartialView();
        }
        else
        {
            string redirect = "";
            if (Request.QueryString["ReturnUrl"] != null)
            {
                redirect = Request.QueryString["ReturnUrl"].ToString();
                return Redirect(redirect);
            }
            else
            {
                return RedirectToRoute("Default");
            }
        }
    }

Затем я выхожу из системы и перенаправляюсь на экран входа в систему:

public RedirectToRouteResult LogOut()
{
    Session.Remove("CurrentUser");
    return RedirectToAction("Index", "Account");
}

Когда я снова набираю свое имя пользователя и пароль, первая точка останова, которая получает удар, выглядит так: (кажется, что при попытке загрузить всю страницу)

    public ActionResult Index()
    {            
        return View();
    }

следующая точка останова - это строка return RedirectToRoute("Default");:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult LogOn(WAPConfigUser user)
    {
        if (!ValidateLogOn(user.UserName, user.Password))
        {
            return PartialView();
        }
        else
        {
            string redirect = "";
            if (Request.QueryString["ReturnUrl"] != null)
            {
                redirect = Request.QueryString["ReturnUrl"].ToString();
                return Redirect(redirect);
            }
            else
            {
                return RedirectToRoute("Default");
            }
        }
    }

но если я пошагово выполняю код, мой маршрут по умолчанию никогда не будет выполнен. Когда я перехожу к следующей строке, она снова переходит к следующей строке Html.RenderAction("LogOn", "Account"); в представлении индекса моего AccountController, и это (только пользовательский элемент управления) возвращается в браузер:

<% var user = (WAPConfigUser) HttpContext.Current.Session["CurrentUser"]; 
   if (user == null || user.IsLoggedIn == false || user.IsPublic) 
   {
       Html.RenderAction("LogOn", "Account");
   } else { %>

    <span class="PageNavLink">
        <% Html.RenderPartial("AccountMenu"); %>        
    </span>
    <div id="IndexContent" class="IndexContent">
        <% Html.RenderAction("UserList", "Account"); %>    
    </div>

<% } %>

Здесь есть несколько вещей, которые я не понимаю.

  1. Почему RedirectToRoute("Default") не перенаправляет меня на маршрут по умолчанию?
  2. Почему пользователь теряет значение NULL после того, как я добавил его в сеанс, когда я вошел во второй раз? (т. е. строка var user = (WAPConfigUser) HttpContext.Current.Session["CurrentUser"]; должна возвращать зарегистрированного пользователя, которого я только что добавил в сеанс, предшествующий этому. Вместо этого эта строка не попадает в точку останова, поэтому, похоже, есть еще один пользователь, НЕ вошедший в систему. Он выполняет строку, которой не должно быть, на странице, которой не должно быть!

Я знаю, что меня, вероятно, застрелят за добавление пользователя в сессию, но кто-нибудь знает, что происходит? Если потребуется дополнительная информация, задайте вопрос, и я обновлю вопрос.

Спасибо

Dave

1 Ответ

0 голосов
/ 01 марта 2010

Проблема была:

сначала он шел в Index и возвращал View ();

public ActionResult Index()
{            
    return View();
}

Это представление содержало инструкцию для вызова

Html.RenderAction("LogOn", "Account");

... и случилось еще кое-что, в чем я не уверен.

Что в итоге сработало, так это получить контроль над POST с помощью jQuery и напрямую вызвать метод действия LogOn. Это обошло потребность в Index (). Я выполнил проверку и в зависимости от результата перенаправил пользователя на нужную страницу.

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