0

尝试使用表单传递数据时,出现可怕的“参数字典包含不可为空类型的参数‘设备 ID’的空条目”错误。我已经在谷歌和堆栈溢出中搜索了答案和解释,但我得出的结论是,问题对我来说是不了解这些东西是如何工作的。来自传统编程背景的网络东西对我来说似乎并不那么直观。

这是我的查看代码

@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();
}

谁能告诉我我到底做错了什么?从我之前读过的答案和我看过的例子来看,我觉得这应该可行。

4

1 回答 1

0

我从您的代码中假设这是一个 Asp.Net MVC 项目,使用 C# 作为语言。

有很多问题。首先是设备ID 变量没有被传递给视图。有很多方法可以做到这一点。最简单的方法是使用 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 类,并将该类传递给您的视图。

其次 - 您在 BeginForm 调用中使用设备 ID 前面的 @ 表示您可能需要研究一下 Razor 语法。一个很好的起点是Phil Haack 的 Razor Syntax Quick Reference。Razor 语法告诉解析器视图的哪些部分是静态 HTML,它应该按原样输出,哪些部分是它应该在发送到浏览器之前执行的 C# 代码。如果您使用 Visual Studio 作为您的 IDE,它非常擅长突出显示代码的哪些部分被解释为 C# 代码,哪些部分被解释为普通 HTML。

在下面的屏幕截图中,您可以看到 VS2012 以浅灰色背景色突出显示 C# 代码。@ 符号是 C# 代码的开始 - 因此您不需要再次使用它,除非您跳出 C# 块并返回 HTML。

在 Visual Studio 2012 中如何突出显示 Razor C# 代码的示例

第三,您可能不想将设备 ID 作为 HTML 属性传递到表单标签中。您应该在表单正文中创建一个隐藏的表单字段,并将名称设置为设备 ID,并将值设置为变量的值。您当前使用它的方式将向表单标签添加一个 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>
}
于 2013-10-08T05:59:49.257 回答