繁体   English   中英

Asp.net MVC 4 - 通过类传递数据

[英]Asp.net MVC 4 - Passing data through classes

我试图在他们登录后在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的索引视图中获取值,该索引视图是我的站点的索引,使用继承来显示但变量重置为null ..继承索引操作用于从我的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));
        }
    }

还有其他方法可以做到这一点吗? 我试图在他们登录后获得用户信息,以及在他们的个人资料图片上显示它...请帮助!!

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

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

但要注意的一点是,基于会话的任何内容在负载平衡系统中都不会总能正常工作,因为您依赖于每次请求都要使用相同的服务器。 我通常建议谨慎使用会话。 在许多情况下,在第二个操作方法上从DB重新加载用户记录实际上可能更容易。

Controller仅持续Web请求的持续时间。 一旦他们登录..控制器完成。 下一个控制器将启动一个全新的实例..当它发生时, name将为null (如您所见)。

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

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

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

您可以在TempData中查找名称,并在重定向的目标操作中从那里抓取它。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM