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

C# Asp.net MVC 4-通过类传递数据,c#,asp.net-mvc,C#,Asp.net Mvc,我试图在ASP.NET MVC 4中的用户登录后传递一个用户名,但我想不出一种方法来传输数据 下面是名为Auth的登录操作,它在设置后获取用户信息 public string name; account userInfo; [HttpPost] [ValidateAntiForgeryToken] public ActionResult Auth(account user) { if (ModelState.IsValid) { userInfo = GetUs

我试图在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");
}
设置name变量后,我尝试从PostController的索引视图中获取该值,该视图是使用继承显示的站点索引,但该变量重置为null。。下面是用于从身份验证操作所在的my 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));
        }
    }

还有别的办法吗?我试图实现获得用户信息后,他们登录显示在索引页面上连同他们的个人资料图片。。请帮忙

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

一种选择是使用TempData作为临时存储—其长度刚好足以将它从一个请求传递到下一个请求。它有session支持,但它的使用寿命要有限得多。 请在此处阅读更多信息:

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

控制器仅在web请求期间有效。一旦他们登录。。那个控制器完成了。下一个控制器将启动一个全新的实例。。当它出现时,正如您所看到的,name将为null

您的整个设置非常奇怪,并且与最佳实践背道而驰。我想说的是,您应该在新请求中再次获取用户信息。但是,在当前设置下如何识别用户是另一个问题。您也可以在会话中存储他们的用户名。。但实际上,您应该使用.NET提供的成员资格类,或者至少应该使用可以通过HttpContext.Current.Identity属性检索的cookie对它们进行登录。这样,您就可以按名称识别它们并再次检索它们的详细信息


另外值得注意的是:您将动态类型ViewBag与强类型模型混合使用。选择一个强类型是首选/最佳实践。

我认为使用继承无法实现这一点。即使AccountController是父类型,但当http请求通过其路由时,实例化的实际对象也会不同。 重定向到后控制器时,后控制器将是AccountController的一个完全不同的对象,而不是具有两种不同静态类型的同一对象


您可以在TempData中丢弃该名称,然后在重定向的目标操作中从那里重新获取该名称。

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


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

这在两个不同的类之间有效吗?与Viewbag和ViewData不同,它将在两个不同的请求之间工作,因此是的。它基本上只是会话状态,但一旦被第二个控制器操作读取,它就会从内存中删除;name=TempData[name];这在我的post控制器中设置了ViewBag.Name=Name;这应该可以完成,然后在请求后删除数据?是的,当第二次操作检索到数据时,它会自动清除。谢谢兄弟,它成功了!现在我可以传输它,分级信息,并将其分配给Post Controller中的一个新实例,然后从那里开始拍摄!谢谢兄弟!还有所有帮助过我的人!每个请求由控制器的新实例处理。想一想如何使它成为无状态的。缓存和会话可以在需要时使用。请记住,使用会话强制以串行方式而不是异步方式处理请求。我明白您的意思,TGH首先指出了TempData的用途,但我感谢您的帮助!我会调查一下现在的情况。身份也一样