2013-07-25 8 views
0

Im пытается передать имя пользователя в ASP.NET MVC 4 после того, как они вошли в систему, но я не могу определить способ передачи данных для передачи.Asp.net MVC 4 - Передача данных через классы

Вот действие входа с именем «Auth», которое получает информацию о пользователях после его набора.

public string name; 
account userInfo; 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Auth(account user) 
{ 
    if (ModelState.IsValid) 
    { 
     userInfo = GetUser(user); 
     if (userInfo.rank == "a") 
     { 
      Session["IsAdmin"] = true; 
      Session["IsMember"] = true; 
      name = userInfo.username; 
      return RedirectToAction("Index", "Mod"); 
     } 
     if (userInfo.rank == "member") 
     { 
      Session["IsMember"] = true; 
      name = userInfo.username; 
      return RedirectToAction("Index", "Post"); 
     } 
    } 

    name = userInfo.username; 
    return View("Login"); 
} 

После имя переменной установлено, я пытаюсь получить значение из моего PostController Индекса View, который является показателем моего сайта с помощью наследования для отображения, но переменная сбрасывается на нуль .. Heres действие Index используется для вызовите переменную имени из моего AccountController, где находится действие Auth.

public class PostController : AccountController 
    { 
     public ActionResult Index(int? id) 
     { 

      /*EncryptConString();*/ 
      int pageNum = id ?? 0; 
      IEnumerable<Post> posts = 
       (from post in db.Posts 
       where post.time < DateTime.Now && post.category == "Blog Post" 
       orderby post.time descending 
       select post).Skip(pageNum * postCount).Take(postCount +1); 

      ViewBag.IsPreviousLinkVisible = pageNum > 0; 
      ViewBag.IsNextLinkVisible = posts.Count() > postCount; 
      ViewBag.PageNumber = pageNum; 
      Session["ShowSide"] = true; 
      ViewBag.showSidebar = showSidePanel; 
      ViewBag.SecAbvPosts = secAbvPosts; 
      ViewBag.IsAdmin = IsAdmin; 
      ViewBag.IsMember = IsMember; 
      ViewBag.Name = name; 
      return View(posts.Take(postCount)); 
     } 
    } 

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

+0

Каждый запрос обрабатывает новый экземпляр контроллера. Подумайте, как вы можете сделать это без гражданства. Кэширование и сеанс можно использовать там, где это необходимо. Имейте в виду, что использование сеанса требует, чтобы запросы обрабатывались последовательно, а не асинхронно. –

ответ

1

Значение не доступно после перенаправления, потому что у вас будет новый экземпляр класса контроллера в результате перенаправления. Никакие данные не будут сохраняться между переадресациями.

Один из вариантов заключается в том, чтобы использовать TempData в качестве временного хранилища - достаточно долго, чтобы передать его с одного запроса на другой. Он поддерживается сессией, но имеет гораздо более ограниченную продолжительность жизни. Подробнее: Using Tempdata in ASP.NET MVC - Best practice

Следует иметь в виду, что любая сессия, основанная на сеансах, не всегда будет хорошо работать в системах с балансировкой нагрузки, поскольку вы будете зависеть от попадания одного и того же сервера с каждым запросом. Обычно я рекомендую использовать сеанс экономно. Во многих случаях на самом деле проще просто перезагрузить запись пользователя из БД по второму методу действий.

+0

Будет ли это работать между 2 классами differnt? в отличие от Viewbag и ViewData? –

+0

Он будет работать между двумя разными запросами, так что да. Это в основном просто состояние сеанса, но оно удаляется из памяти, когда оно считывается вторым действием контроллера. – TGH

+0

Как насчет этого TempData ["Name"] = user.Name; name = TempData ["Name"]; Это в моем пост-контроллере установлен ViewBag.Name = name; Это должно быть сделано, а затем стереть данные после этого запроса? –

1

A Controller действует только на весь веб-запрос. Как только они войдут в систему, этот контроллер будет выполнен. Следующий контроллер будет запускаться с новым экземпляром .. и когда это произойдет, name будет null (как вы видели).

Вся ваша установка очень странная и действительно против лучших практик. Я бы сказал, что вы должны просто получить информацию о пользователе снова в своем новом запросе. Однако, как вы идете об идентификации пользователя, учитывая текущую настройку, это еще одна проблема. Вы могли бы хранить свое имя пользователя в Session тоже .. но на самом деле вы должны использовать классы Membership, предоставляемые .NET. Или вы должны хотя бы подписать их с помощью файла cookie, который вы можете получить через свойство HttpContext.Current.Identity. Таким образом вы можете идентифицировать их по имени и снова получить их данные.

Также обратите внимание: вы смешиваете dynamic печатать (ViewBag) с сильно типизированными моделями. Выберите один (строго типизированный является предпочтительным/лучшей практикой).

+0

Я вижу, что вы имеете в виду, TGH указал на использование для TempData, но я ценю вашу помощь! Я тоже загляну в Current.Identity –

0

Я не думаю, что вы можете достичь этого, используя наследование. Даже несмотря на то, что AccountController является родительским типом, фактические объекты, которые создаются, будут отличаться, поскольку запрос http перемещается по его маршруту. Когда вы перенаправляете на PostController, PostController будет совсем другим объектом для AccountController, а не с тем же объектом с двумя разными статическими типами.

Вы можете вырезать имя в TempData и отхватить его оттуда в перенаправленном целевом действии.

0

Это неправильный способ проверки подлинности в MVC.Вы должны использовать либо Аутентификацию Windows, либо FormsAuthentication, либо какой-либо другой механизм, реализующий IIdentity и IPrincipal.

Вы можете увидеть пример того, как это работает, создавая стандартное приложение для интернет-шаблонов и просматривая код AccountController и ищите FormsAuthentication. Затем вы должны использовать атрибут [Авторизовать] для управления доступом.

+0

Я собираюсь сделать это сейчас –

Смежные вопросы