我正在尝试创建一个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);
}
}
}
答案 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);
}