我尝试在登录后在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 Action所在的AccountController。
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
要记住的一点是,基于会话的任何内容在负载平衡系统中都不会总是很好用,因为您依赖于每个请求都要使用相同的服务器。我通常建议谨慎使用会话。在许多情况下,在第二个操作方法上从DB重新加载用户记录实际上可能更容易。
答案 1 :(得分:1)
Controller
仅在网络请求期间有效。一旦他们登录..控制器完成。下一个控制器将启动一个全新的实例..当它发生时,name
将是null
(正如您所见)。
您的整个设置非常奇怪,并且确实违反了最佳做法。我要说的是,您应该在新请求中再次获取用户信息。但是,考虑到当前设置,如何识别用户是另一个问题。您可以将用户名存储在Session
中..但实际上,您应该使用.NET提供的Membership
类,或者至少应该使用您可以通过HttpContext.Current.Identity
属性检索的Cookie。这样您就可以通过名称识别它们并再次检索它们的详细信息。
另外值得注意的是:您正在使用强类型模型混合dynamic
输入(ViewBag
)。选择一个(强类型是首选/最佳实践)。
答案 2 :(得分:0)
我认为你不能使用继承来实现这一点。尽管AccountController是父类型,但实例化的实际对象将随着http请求传播其路由而不同。 当您重定向到PostController时,PostController将是与AccountController完全不同的对象,而不是具有2种不同静态类型的同一对象。
您可以在TempData中删除该名称,然后在重定向的目标操作中将其从中取回。
答案 3 :(得分:0)
这是在MVC中进行身份验证的错误方法。您应该使用Windows身份验证或FormsAuthentication,或其他一些实现IIdentity和IPrincipal的机制。
您可以通过生成默认的Internet模板应用程序并查看AccountController代码来查看其工作原理的示例,并查找FormsAuthentication。然后,您将使用[Authorize]属性来控制访问。