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

11 浏览
0 Comments

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

我刚接触MVC,解决以下问题让我很困难。我通过Session["LoggedUserID"]获取到了用户的ID,这个ID在用户登录时获取。我想将它传递给下面的cshtml代码(或者直接在控制器中?)我暂时还不理解这个问题。这个操作在用户想要创建新帖子时发生。

在cshtml视图中(代码是从控制器自动生成的):

@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.CreatorUserId, "CreatorUserId", htmlAttributes: new { @class = "control-label col-md-2" })
@Html.DropDownList("CreatorUserId", null, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.CreatorUserId, "", new { @class = "text-danger" })

我的控制器代码:

[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的外键。

编辑:我目前的代码出现以下错误消息:

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

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

0
0 Comments

问题原因:在控制器中,使用Session来传递数据到视图,但在视图中的代码出错,因为视图中使用了DropDownList辅助方法,该方法需要在ViewData字典中设置用于填充下拉列表的数据,而在控制器中并未设置该数据。

解决方法:移除视图中包含DropDownList和ValidationMessageFor的外部div,因为不需要显示下拉列表,这样可以避免错误。

以下是修复后的控制器代码:

[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);        
}

修复后的视图代码:

@model Review
@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()
    
    

Review


@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
} @section Scripts { @Scripts.Render("~/bundles/jqueryval") }

通过以上修复,问题得以解决。

0
0 Comments

在MVC中,有时候需要将控制器中的会话数据传递给视图。这个问题的出现原因是需要将某个值(例如“用户ID”)绑定到视图模型,或者将其放入视图包中,然后可以在cshtml文件中访问它。

解决方法之一是创建一个名为SampleViewModel的类,其中包含一个名为UserId的属性。然后可以通过以下方式使用它:

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

需要将视图模型绑定到cshtml文件中,例如:

@model SampleViewModel.cs

另一种解决方法是将值存储在视图包中,例如:

ViewBag.UserId = your-value; //在cshtml页面中可以调用.UserId

希望这样能帮到你。

0