C# 使用@Html.Beginform传递参数
我得到了一个可怕的“参数字典包含一个非空类型的参数'equipmentid'的空条目”错误,当试图通过表单传递数据时。我已经搜索了google和stack overflow的答案和解释,但我得出结论,问题在于我不理解这些东西是如何工作的。来自传统编程背景的web内容在我看来并不那么直观 这是我的查看代码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
@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的情况下初始化表单,并使用了一个隐藏字段。