0

我试图在他们登录后在 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 的索引视图中获取值,这是我的站点的索引,使用继承来显示,但变量重置为空。这是用于从我的 AccountController 调用名称变量的索引操作Auth Action 所在的位置。

    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));
        }
    }

还有其他方法可以做到这一点吗?我试图在用户登录后获取用户信息以将其与他们的个人资料图片一起显示在索引页面上。请帮助!

4

4 回答 4

1

AController仅在 Web 请求期间持续。一旦他们登录..那个控制器就完成了。下一个控制器将启动一个全新的实例。当它启动时,name将会启动null(如您所见)。

您的整个设置非常奇怪,并且确实违反了最佳实践。我要说的是,您应该在新请求中再次获取用户信息。但是,根据当前设置如何识别用户是另一个问题。您也可以将他们的用户名存储在其中Session。但实际上,您应该使用Membership.NET 提供的类,或者您至少应该使用可以通过HttpContext.Current.Identity属性检索的 cookie 登录它们。这样您就可以通过名称识别它们并再次检索它们的详细信息。

另请注意:您将dynamic键入 ( ViewBag) 与强类型模型混合在一起。选择一个(强类型是首选/最佳实践)。

于 2013-07-25T02:40:03.903 回答
1

重定向后该值不可用,因为重定向后您将拥有一个全新的控制器类实例。重定向之间不会保留任何数据。

您拥有的一种选择是使用 TempData 作为临时存储 - 只需足够长的时间将其从一个请求传递到下一个请求。它由会话支持,但它的生命周期要有限得多。在此处阅读更多内容:在 ASP.NET MVC 中使用 Tempdata - 最佳实践

但是要记住的一件事是,任何基于会话的东西在负载平衡系统中并不总是能很好地工作,因为您依赖于每个请求都访问同一台服务器。我通常建议谨慎使用会话。在许多情况下,在第二种操作方法上从数据库重新加载用户记录实际上可能更容易。

于 2013-07-25T02:38:53.397 回答
0

我不认为你可以使用继承来实现这一点。即使 AccountController 是父类型,实际实例化的对象也会随着 http 请求经过其路由而有所不同。当您重定向到 PostController 时,PostController 将是与 AccountController 完全不同的对象,而不是具有 2 种不同静态类型的同一对象。

您可以在 TempData 中删除名称,然后在重定向的目标操作中从那里取回它。

于 2013-07-25T02:45:58.460 回答
0

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

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

于 2013-07-25T07:29:24.547 回答