【问题标题】:How to pass Session data from controller to View (MVC)如何将会话数据从控制器传递到视图(MVC)
【发布时间】:2016-09-26 18:08:26
【问题描述】:

我是 MVC 的新手,我很难解决以下问题。我通过Session["LoggedUserID"] 获得了一个用户ID,因为它在用户登录后获得。我想将它传递给我目前不明白的以下cshtml代码(或直接在控制器中?)。一旦用户想要创建新帖子,就会发生此操作。

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(或直接通过控制器)? Review 表使用 userID 作为用户 ID 的 FK。

编辑:我当前代码收到的错误消息是:

没有“IEnumerable”类型的 ViewData 项 有键 'CreatorUserId'。

非常感谢任何帮助。谢谢。

【问题讨论】:

  • 可以在控制器中访问会话,所以不清楚实际问题是什么。
  • stackoverflow.com/questions/18608452/… ... 真的不清楚您有什么问题(可能是因为您不了解 ASP.Net MVC 的工作原理或 Session 的工作原理)。
  • 你的意思是“将会话传递给 Cshtml”?您想通过以便可以在标签中显示它吗?或者是其他东西 ?你必须清楚你在做什么。此外,您当前的代码正在使用 DropDownList 辅助方法,我没有看到在您的 GET 操作中设置任何 ViewData 来填充下拉列表(这就是您收到“没有 ViewData ....”错误消息的原因!跨度>
  • @skylake 查看我发布的答案

标签: c# asp.net-mvc razor database-first


【解决方案1】:

如果是与实体一起保存,则无需将其传递给视图并发送回服务器。您可以直接在 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 属性)。理想情况下,您可以将其移出操作方法以检查用户是否已登录(可能是操作过滤器like this

【讨论】:

  • 我仍然遇到同样的错误:There is no ViewData item of type 'IEnumerable' that has the key 'CreatorUserId'. 在线 -> @Html.DropDownList("CreatorUserId", null, htmlAttributes: new { @class = "form-control" })。由于我使用 userID 的 guid 而不是 int 我必须将 review.UserID = Convert.ToInt32(Session["LoggedUserID"]); 更改为 Guid guidSess = new Guid(Session["LoggedUserID"].ToString()); 并将 guidSess 传递给 review.CreatorUserId = guidSess;。这样做是否正确?以防万一这导致了错误。
  • 没有。您的错误是因为您的视图代码正在使用 DropDownList 辅助方法,该方法希望您设置将下拉列表填充到 Viewdata 字典所需的数据。由于不需要显示下拉列表,只需从您的视图中删除包含行 @Html.DropDownListValidationMessageFor 的外部 div
  • 啊,我明白了!你之前提到过,但我不小心忽略了它。谢谢你,我真的从中学到了很多。
【解决方案2】:

您需要将值(即“用户 ID”)绑定到视图模型或将其放入视图包中,您可以在 cshtml 中访问它。

例如

SampleViewModel vm = new SampleViewModel(){UserId = yourvalue}; 

您需要使用名为UserId 的属性创建此SampleViewModel 类,然后您可以像这样使用。您还需要将视图模型绑定到您的 cshtml,例如 - @model SampleViewModel.cs

或者您可以将值存储在视图包中。 即

ViewBag.UserId = your-value; //You can call @ViewBag.UserId in cshtml page. 

这有帮助吗?

【讨论】:

    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    相关资源
    最近更新 更多