我得到了可怕的“参数字典包含非空类型参数‘设备’的空条目”,当试图用表单传递数据时,错误。我已经搜索过谷歌和堆栈溢出的答案和解释,但我得出的结论是,这个问题对我来说是不理解这些东西是如何工作的。从传统的编程背景来看,网络内容在我看来并不那么直观。
这是我的视图代码
@using (Html.BeginForm("CreateReservation", "ReservationList", FormMethod.Get, new { @equipmentID = 1 }))
{
<button class="btn btn-blue">Click</button>
}这是我的控制器
public ActionResult CreateReservation(int equipmentid)
{
// TODO: Query the piece of equipment being reserved.
return View();
}有人能告诉我我到底做错了什么吗?从我以前读过的答案和我看过的例子来看,我觉得这是可行的。
发布于 2013-10-08 05:59:49
我从您的代码中假设这是一个Asp.Net MVC项目,使用C#作为语言。
有几个问题。首先,equipmentID变量没有传递给视图。有许多方法可以做到这一点。最简单的方法是在控制器中使用ViewData字典,如下所示:
public ActionResult CreateReservation(int equipmentid)
{
// TODO: Query the piece of equipment being reserved.
ViewData["equipmentID"] = equipmentid;
return View();
}完成此操作后,可以修改视图代码以使用以下值:
@using (Html.BeginForm("CreateReservation", "ReservationList", FormMethod.Get, new { equipmentID = ViewData["equipmentID"] }))
{
<button class="btn btn-blue">Click</button>
}对于一两个值来说,这是可以的,但是当视图变得更复杂时,您更希望创建一个ViewModel类,并将该类传递给您的视图。
第二,在您的equipmentID调用中使用BeginForm前面的@表示您可能需要研究一下Razor语法。菲尔·哈克的Razor语法快速参考是一个很好的起点。剃刀语法告诉解析器视图的哪些部分是静态的,应该按原样输出,哪些部分是C#代码,在发送到浏览器之前应该执行这些代码。如果您使用Visual作为您的IDE,那么它非常擅长突出显示您的代码的哪些部分被解释为C#代码,哪些部分被解释为普通的HTML。
在下面的截图中,您可以看到VS2012用浅灰背景颜色突出显示C#代码。@符号是C#代码的开始-所以您不需要再次使用它,除非您突破了C#块并返回到C#。

第三,您可能不希望将设备ID作为HTML属性传递到表单标记中。您应该在表单主体中创建一个隐藏的表单字段,并将名称设置为equipmentID,将值设置为变量的值。当前使用它的方式将向form标记添加一个HTML属性,生成的代码如下所示:
<form action="/ReservationList/CreateReservation" method="get" equipmentID="1">而这个额外的属性在您的代码中是不可检索的。相反,在你看来,应该这样做:
@using (Html.BeginForm("CreateReservation", "ReservationList", FormMethod.Get, new { name = "myFormName", id = "myFormID" }))
{
@Html.Hidden("equipmentID", ViewData["equipmentID"])
<button class="btn btn-blue">Click</button>
}https://stackoverflow.com/questions/19239971
复制相似问题