使用@ Html.Beginform传递参数

时间:2013-10-08 05:45:16

标签: c# html5 button get html.beginform

我遇到了可怕的 “在尝试传递数据时,参数字典包含非可空类型” 参数'equipmentid'的空条目表单。我已经搜索了谷歌和堆栈溢出的答案和解释,但我得出结论,问题是我不明白这些东西是如何工作的。来自传统的编程背景,网络内容对我来说似乎并不直观。

这是我的观看代码

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

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

1 个答案:

答案 0 :(得分:0)

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

有很多问题。第一个是没有将deviceID变量传递给视图。有很多方法可以做到这一点。最简单的方法是使用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's Razor Syntax Quick Reference。 Razor语法告诉解析器视图的哪些部分是静态HTML,它应该按原样输出,哪些部分是在发送到浏览器之前应该执行的C#代码。如果您使用Visual Studio作为IDE,则非常擅长突出显示代码的哪些部分被解释为C#代码,哪些部分被解释为普通HTML。

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

Example of how Razor C# code is highlighted in Visual Studio 2012

第三,您可能不希望将设备ID作为HTML标签内的HTML属性传递。您应该在表单体内创建一个隐藏的表单字段,并将名称设置为equipmentID,将值设置为变量的值。您当前使用它的方式将向表单标记添加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>
}