2013-07-25 70 views
0

我试着在ASP.NET MVC 4传递一个用户名,他们已登录,但我不能想出一个办法来获取数据转移之后。Asp.net MVC 4 - 通过类传递数据

这里被命名为“验证”登录的行动,得到了一组后的用户信息。

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中的索引视图,它的值是使用继承来显示,但变量重置为null我的网站的索引..继承人用于索引操作从Auth Action所在的AccountController中调用name变量。

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个不同的类之间工作吗?不像Viewbag和ViewData? –

+0

它会在两个不同的请求之间工作,所以是的。它基本上只是会话状态,但一旦被第二个控制器操作读取,它就从内存中移除。 – TGH

+0

这个怎么样 TempData [“Name”] = user.Name; name = TempData [“Name”]; 这在我的后控制器中设置ViewBag.Name = name; 应该这样做然后擦除请求后的数据? –

1

A Controller只会持续网络请求期间。一旦他们登录..该控制器完成。下一个控制器会启动一个全新的实例..当它发生时,name将会是null(如你所见)。

您的整个安装过程非常奇怪,实际上违背了最佳实践。我想说的是,你应该在新的请求中再次获取用户信息。鉴于目前的设置,如何确定用户是另一个问题。你可能也将他们的用户名存储在Session ..但实际上,你应该使用.NET提供的Membership类,或者你至少应该使用可以通过HttpContext.Current.Identity属性检索的cookie对它们进行签名。这样,您可以通过名称来识别它们并再次检索它们的详细信息。

另外值得注意的是:你混dynamic与强类型的模型类型(ViewBag)。选一个(强类型是首选/最佳实践)。

+0

我明白你的意思了,TGH先指出了TempData的用法,但我很感谢你的帮助人!我也会看看Current.Identity –

0

我不认为你可以实现这个使用继承。尽管AccountController是一个父类型,但实例化的实际对象将随着http请求行进路线而不同。 当您重定向到PostController时,PostController将是与AccountController完全不同的对象,而不是具有2种不同静态类型的同一对象。

你可以另送TempData的名称,并抓住它从那里回来的重定向目标的行动。

0

这是在MVC中进行身份验证的错误方法。您应该使用Windows身份验证或FormsAuthentication或其他一些实现IIdentity和IPrincipal的机制。

您可以通过生成默认的互联网模板应用程序并查看AccountController代码并查找FormsAuthentication来查看如何工作的示例。然后您将使用[Authorize]属性来控制访问。

+0

我现在要这样做 –