如何将会话数据从控制器传递到视图(MVC)
How to pass Session data from controller to View (MVC)
我是 MVC 的新手,我很难解决以下问题。我通过 Session["LoggedUserID"]
获得了一个用户 ID,因为它在用户登录后获得。我想将它传递给以下 cshtml 代码( 或直接在控制器中?),我不明白目前。一旦用户想要创建一个新的 post,就会发生此操作。
在 cshtml 视图中(从控制器自动创建的代码):
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.CreatorUserId, "CreatorUserId", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("CreatorUserId", null, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.CreatorUserId, "", new { @class = "text-danger" })
</div>
</div>
我的控制器代码:
[HttpGet]
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(Review review)
{
if (ModelState.IsValid) {
db.Reviews.Add(review);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(review);
}
如何将 Session["LoggedUserID"]
传递给 cshtml( 或直接通过控制器)?评论 table 正在使用 userID 作为用户 ID 的 FK。
编辑:我收到的当前代码的错误消息是:
There is no ViewData item of type 'IEnumerable' that
has the key 'CreatorUserId'.
非常感谢任何帮助。谢谢。
您需要绑定值,即 "User ID" 以查看模型或将其放入视图包中,您可以在 cshtml 中访问它。
例如
SampleViewModel vm = new SampleViewModel(){UserId = yourvalue};
您需要使用名为 UserId
的 属性 创建此 SampleViewModel
class,然后您可以像这样使用。您还需要将视图模型绑定到您的 cshtml - @model SampleViewModel.cs
或者您可以将值存储在视图包中。
即
ViewBag.UserId = your-value; //You can call @ViewBag.UserId in cshtml page.
这有帮助吗?
如果是用entity保存,就不需要传递给view再传回server。您可以直接在您的 HttpPost 操作方法中使用它。
[HttpPost]
public ActionResult Create(Review review)
{
if (ModelState.IsValid)
{
if(Session["LoggedUserID"]==null)
{
return Content("Session LoggedUserID is empty");
}
review.UserID = Convert.ToInt32(Session["LoggedUserID"]);
db.Reviews.Add(review);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(review);
}
我还添加了一个 If 条件来检查 Session["LoggedInUserID"]
是否为空,然后再将其读取到一个 int 变量(UserID
属性)。理想情况下,您可以将其移出操作方法以检查用户是否登录(可能是操作过滤器 )
我是 MVC 的新手,我很难解决以下问题。我通过 Session["LoggedUserID"]
获得了一个用户 ID,因为它在用户登录后获得。我想将它传递给以下 cshtml 代码( 或直接在控制器中?),我不明白目前。一旦用户想要创建一个新的 post,就会发生此操作。
在 cshtml 视图中(从控制器自动创建的代码):
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.CreatorUserId, "CreatorUserId", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("CreatorUserId", null, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.CreatorUserId, "", new { @class = "text-danger" })
</div>
</div>
我的控制器代码:
[HttpGet]
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(Review review)
{
if (ModelState.IsValid) {
db.Reviews.Add(review);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(review);
}
如何将 Session["LoggedUserID"]
传递给 cshtml( 或直接通过控制器)?评论 table 正在使用 userID 作为用户 ID 的 FK。
编辑:我收到的当前代码的错误消息是:
There is no ViewData item of type 'IEnumerable' that has the key 'CreatorUserId'.
非常感谢任何帮助。谢谢。
您需要绑定值,即 "User ID" 以查看模型或将其放入视图包中,您可以在 cshtml 中访问它。
例如
SampleViewModel vm = new SampleViewModel(){UserId = yourvalue};
您需要使用名为 UserId
的 属性 创建此 SampleViewModel
class,然后您可以像这样使用。您还需要将视图模型绑定到您的 cshtml - @model SampleViewModel.cs
或者您可以将值存储在视图包中。 即
ViewBag.UserId = your-value; //You can call @ViewBag.UserId in cshtml page.
这有帮助吗?
如果是用entity保存,就不需要传递给view再传回server。您可以直接在您的 HttpPost 操作方法中使用它。
[HttpPost]
public ActionResult Create(Review review)
{
if (ModelState.IsValid)
{
if(Session["LoggedUserID"]==null)
{
return Content("Session LoggedUserID is empty");
}
review.UserID = Convert.ToInt32(Session["LoggedUserID"]);
db.Reviews.Add(review);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(review);
}
我还添加了一个 If 条件来检查 Session["LoggedInUserID"]
是否为空,然后再将其读取到一个 int 变量(UserID
属性)。理想情况下,您可以将其移出操作方法以检查用户是否登录(可能是操作过滤器