@ViewBag从UserProfile中获取null值
本文关键字:null 获取 UserProfile @ViewBag | 更新日期: 2023-09-27 18:26:13
我在将值从UserProfile
传递到@Viewbag以在Index.cshtml
中显示时遇到了一些问题。
让我们来解释一下:
当我注册新用户或登录时,我试图在viewbag中从UserProfile
传递UserType
字段。UserType是我在UserProfile
上创建的一个自定义字段,用于验证用户是否为"Musico"或"Ouvente"
调试应用程序后,我看到viewbag的值为NULL。
这是我试图从Register and Login post method
:中的UserProfile
中获取值的代码
登录后方法
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid && WebSecurity.Login(model.UserName,
model.Password,
persistCookie: model.RememberMe))
{
var context = new UsersContext();
var username = User.Identity.Name;
var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username);
var userType = user.UserType;
TempData["UserType"] = userType; //Taking UserType from User Profile
return RedirectToLocal(returnUrl);
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
注册后方法
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
var context = new UsersContext();
var username = User.Identity.Name;
var user = context.UserProfiles
.SingleOrDefault(u => u.UserName == username);
var userType = user.UserType;
WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new
{
UserType = model.UserType
});
WebSecurity.Login(model.UserName, model.Password);
// string currentUserType = u.UserType;
TempData["UserType"] = userType;//Get the userType to validate on _Layout
return RedirectToAction("Index", "Home");
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
}
}
return View(model);
}
在索引页面的一部分调用viewbag
<p>
@if (Request.IsAuthenticated && ViewBag.UserType.Equals("Musico"))
{
<span>musico</span>
}
else if (Request.IsAuthenticated && ViewBag.UserType.Equals("Ouvinte"))
{
<span>ouvinte</span>
} else{
<span>teste</span>
}
</p>
家庭控制器
public ActionResult Index()
{
ViewBag.UserType = TempData["UserType"];
return View();
}
有关何时使用ViewBag、ViewData或TempData的详细说明,请参阅本文。
一旦控制器重定向,ViewBag和ViewData将包含null值。如果在重定向后使用调试工具检查TempData对象,您将看到它已完全填充。
改为:
TempData["UserType"] = userType;
相应地更改您的视图,即
@{var tempUserType = TempData["UserType"]} // in the top
然后像使用ViewBag 一样使用它
ViewBag由于重定向而丢失。一个简单的解决方案是使用TempData,它只有在一个额外的请求后才有效。在那之后,它通常会消失,但有一个Keep方法。
来自MSDN:
但是,TempDataDictionary对象中的数据仅从一个请求到下一个请求,除非您为使用Keep方法保留。如果密钥被标记为保留,密钥被保留用于下一个请求。
示例:
[Authorize]
public class AccountController : Controller
{
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// do stuff
TempData["UserType"] = userType;
return RedirectToAction("Index", "Home");
}
// something went wrong, return view
return View(model);
}
}
[Authorize]
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.UserType = TempData["UserType"];
return View();
}
}