@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从UserProfile中获取null值

有关何时使用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();
    }
}