@ViewBag从UserProfile获取空值

时间:2014-10-11 19:30:05

标签: c# asp.net asp.net-mvc-4 razor viewbag

我在将UserProfile的值传递给@Viewbag以显示Index.cshtml时遇到了一些问题。

让我们解释一下

当我注册新用户或登录时,我试图从UserType中的UserProfile字段中传递UserProfile字段。 UserType是我在UserProfile上创建的自定义字段,用于验证用户是否为" Musico"或" Ouvinte"

在调试应用程序之后,我看到viewbag正在取NULL值。

这是我尝试从Register and Login post method中的[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);
}

注册POST方法

<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>

在“索引”页面的一部分中调用viewbag

public ActionResult Index()
{
    ViewBag.UserType = TempData["UserType"];
    return View();
}

的HomeController

{{1}}

2 个答案:

答案 0 :(得分:2)

请参阅此文章以获得更好的解释,When to use ViewBag, ViewData, or TempData

  

..一旦控制器重定向,ViewBag和ViewData将包含空值。如果在重定向后使用调试工具检查TempData对象,您将看到它已完全填充。

请改为:

TempData["UserType"] = userType;

相应地改变你的观点,即

@{var tempUserType = TempData["UserType"]} // in the top

然后像使用ViewBag一样使用它

答案 1 :(得分:1)

由于重定向,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();
    }
}