MVC应用程序中ViewBag的空值不一致

时间:2014-06-08 18:41:32

标签: c# asp.net asp.net-mvc viewbag

我正在尝试创建一个MVC应用程序,该应用程序使用部分视图来更新注释,这些注释在大约24分钟标记的http://www.microsoftvirtualacademy.com/Content/ViewContent.aspx?et=4099&m=4094&ct=19603示例后面的表单中发布。除了我使用“Id”而不是“ID”之外,我的代码应该完全匹配他们的代码,但是我已经检查了代码中的不一致性,但没有找到。

当我尝试将ViewBag.SessionId传递到我的_CommentForm控制器的Comment方法的参数字典中时(提交表单时),我收到一条错误消息:

  

参数字典包含'ConferenceExample.Controllers.CommentController'中方法'System.Web.Mvc.PartialViewResult _CommentForm(Int32)'的非可空类型'System.Int32'的参数'sessionId'的空条目。可选参数必须是引用类型,可空类型,或者声明为可选参数。   参数名称:参数

以下是导致此问题的代码:

@using (Html.BeginForm("_Submit", "Comment", FormMethod.Post))
{
    @Html.AntiForgeryToken()
    <text>@ViewBag.SessionId</text>
    @Html.Action("_CommentForm", new { sessionId = ViewBag.SessionId })
}

当我强制ViewBag.SessionId在分配给sessionId之前作为文本输出时,它会在屏幕上完美打印出来,但它会到达@Html.Action()的行并抛出错误。

同样,如果我尝试将ViewBag.SessionId的值分配给变量并将其作为参数传递,我会得到类似的消息:

@using (Html.BeginForm("_Submit", "Comment", FormMethod.Post))
{
    @Html.AntiForgeryToken()
    <text>@ViewBag.SessionId</text>
    int foo = ViewBag.SessionId;
    @Html.Action("_CommentForm", new { sessionId = foo })
}

出现以下错误消息:     Cannot convert null to 'int' because it is a non-nullable value type

我不太清楚为什么ViewBag.SessionId在某些情况下会有值但在其他情况下却没有,尽管我认为它与动态表达式有关。

这是我的第一篇文章,所以请告诉我,如果有什么我可以做的,以便在将来改善我的帖子。谢谢!

编辑:(包含控制器)

上面的代码位于_GetForSession视图中。调用它的控制器在下面。

namespace ConferenceExample.Controllers
{
    public class CommentController : Controller
    {
        ConferenceContext context = new ConferenceContext();

        //Get list of all comments for a session
        public PartialViewResult _GetForSession(int sessionId)
        {
            ViewBag.SessionId = sessionId;
            //This kind of data access would be in the repo in production
            List<Comment> comments = context.Comments.Where(c => c.SessionId == sessionId).ToList();
            return PartialView("_GetForSession", comments);
        }

        //Create new comment submit form
        public PartialViewResult _CommentForm(int sessionId)
        {
            Console.WriteLine(sessionId.ToString());
            Comment comment = new Comment() { SessionId = sessionId };
            return PartialView("_CommentForm", comment);
        }

        //Accept new comment
        [ValidateAntiForgeryToken()]
        public PartialViewResult _Submit(Comment comment)
        {
            //In production you would make sure that the comment is valid before saving it
            context.Comments.Add(comment);
            context.SaveChanges();

            List<Comment> comments = context.Comments.Where(c => c.SessionId == 
                 comment.SessionId).ToList();

            return PartialView("_GetForSession", comments);

        }
    }
}

1 个答案:

答案 0 :(得分:0)

由于ViewBag.SessionId导致的错误变为null。为了解决此问题,请将操作中的参数更改为可为空的


 public  PartialViewResult _CommentForm(int? sessionId)
    {
        Console.WriteLine(sessionId.ToString());
        Comment comment = new Comment() { SessionId = sessionId??0 };
        return PartialView("_CommentForm", comment);
    }