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

本文关键字:数据 net MVC 4-通 Asp | 更新日期: 2023-09-27 18:25:00

我试图在登录后在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。。这是用于从Auth操作所在的AccountController调用名称变量的Index操作。

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

我还有别的办法吗?我试图在用户登录后获得信息,并将其与他们的个人资料图片一起显示在索引页面上。。请帮忙!!

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

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

一种选择是将TempData用作临时存储,其长度刚好可以将其从一个请求传递到下一个请求。它有会话支持,但它的使用寿命要有限得多。点击此处阅读更多:在ASP.NET MVC中使用Tempdata-最佳实践

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

Controller仅在web请求的持续时间内有效。一旦他们登录。。该控制器完成。下一个控制器将启动一个全新的实例。。当它发生时,name将是null(正如您所看到的)。

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

还需要注意的是:您将dynamic类型(ViewBag)与强类型模型混合使用。选择一个(强类型是首选/最佳实践)。

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

你可以在TempData中丢弃这个名字,然后在重定向的目标操作中从那里取回它。

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

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