Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用@Html.Beginform传递参数_C#_Html_Button_Get_Html.beginform - Fatal编程技术网

C# 使用@Html.Beginform传递参数

C# 使用@Html.Beginform传递参数,c#,html,button,get,html.beginform,C#,Html,Button,Get,Html.beginform,我得到了一个可怕的“参数字典包含一个非空类型的参数'equipmentid'的空条目”错误,当试图通过表单传递数据时。我已经搜索了google和stack overflow的答案和解释,但我得出结论,问题在于我不理解这些东西是如何工作的。来自传统编程背景的web内容在我看来并不那么直观 这是我的查看代码 @using (Html.BeginForm("CreateReservation", "ReservationList", FormMethod.Get, new { @equipmentID

我得到了一个可怕的“参数字典包含一个非空类型的参数'equipmentid'的空条目”错误,当试图通过表单传递数据时。我已经搜索了google和stack overflow的答案和解释,但我得出结论,问题在于我不理解这些东西是如何工作的。来自传统编程背景的web内容在我看来并不那么直观

这是我的查看代码

@using (Html.BeginForm("CreateReservation", "ReservationList", FormMethod.Get, new { @equipmentID = 1 }))
{
  <button class="btn btn-blue">Click</button>
}

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

我从您的代码中假设这是一个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>
}
完成此操作后,您可以修改视图代码以使用以下值:

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>
}
@使用(Html.BeginForm(“CreateReservation”,“ReservationList”,FormMethod.Get,new{equipmentID=ViewData[“equipmentID”]}))
{
点击
}
对于一个或两个值来说,这很好,但是当视图变得更复杂时,您更希望创建一个ViewModel类,并将该类传递给视图

其次,在BeginForm调用中使用@front-of-equipmentID表示您可能需要进一步研究Razor语法。一个好的开始是。Razor语法告诉解析器视图的哪些部分是静态HTML,应该按原样输出,哪些部分是C代码,应该在发送到浏览器之前执行。如果您使用visualstudio作为IDE,那么它非常擅长突出显示代码的哪些部分被解释为C#代码,哪些部分被解释为普通HTML

在我下面的截图中,你可以看到VS2012以浅灰色背景突出显示C代码。@symbol是C代码的开始,所以你不需要再次使用它,除非你跳出C代码块回到HTML

第三,您可能不希望将设备ID作为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>
}
@使用(Html.BeginForm(“CreateReservation”,“ReservationList”,FormMethod.Get,new{name=“myFormName”,id=“myFormID”}))
{
@Html.Hidden(“设备ID”,ViewData[“设备ID”])
点击
}

好的,所以我删除了FormMethod.Get参数,它工作得很好(还有那个不应该存在的@)。现在我的问题是,为什么?我看过FormMethod.Get的视图代码,它们应该和我读到的一样好用。我是否遗漏了需要在控制器中才能正常工作的内容?非常好的解释,谢谢!尽管如此,我注意到BeginFormLine仍然将equipmentID添加到动作链接的末尾。是的,很好地发现了。我决定一次做一个改变,只是为了把改变弄清楚。第一个更改只是显示如何使用ViewData。我的上一个代码片段显示了如何在不传递equipmentID的情况下初始化表单,并使用了一个隐藏字段。