我在将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}}
答案 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();
}
}