如何将会话数据从控制器传递到视图(MVC)

本文关键字:视图 MVC 控制器 会话 数据 | 更新日期: 2023-09-27 18:08:59

我是MVC新手,我很难解决以下问题。我通过Session["LoggedUserID"]获得userID,因为它一旦用户登录。我想把它传递给下面的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 (或直接通过控制器)?查看表使用userID作为用户ID的FK。

编辑:我得到的当前代码的错误信息是:

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

任何帮助都是非常感激的。谢谢。

如何将会话数据从控制器传递到视图(MVC)

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

您需要绑定值,即"用户ID"来查看模型或者把它放到视图包中你可以在cshtml中访问它。

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

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

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

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

这有帮助吗?