【问题标题】:Passing params with @Html.Beginform使用 @Html.Beginform 传递参数
【发布时间】:2013-10-14 22:04:20
【问题描述】:

当我尝试使用表单。我已经搜索了谷歌和堆栈溢出来寻找答案和解释,但我得出的结论是,问题对我来说是不了解这些东西是如何工作的。来自传统编程背景的网络东西对我来说似乎并不那么直观。

这是我的视图代码

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

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

【问题讨论】:

  • 好的,所以我删除了 FormMethod.Get 参数,它运行良好(以及不应该存在的 @)。现在我的问题是,为什么?我已经看到使用 FormMethod.Get 的视图代码,就我所读到的而言,它们应该可以正常工作。我是否遗漏了一些需要在我的控制器中才能正常工作的东西?

标签: c# html button get html.beginform


【解决方案1】:

我从您的代码中假设这是一个 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's Razor Syntax Quick Reference。 Razor 语法告诉解析器视图的哪些部分是静态 HTML,它应该按原样输出,哪些部分是 C# 代码,它应该在发送到浏览器之前执行。如果您使用 Visual Studio 作为您的 IDE,它非常擅长突出显示您的代码的哪些部分被解释为 C# 代码,哪些部分被解释为普通 HTML。

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

第三,您可能不想将设备 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>
}

【讨论】:

  • 很好的解释谢谢!虽然,我注意到开始表单行仍然将设备 ID 添加到操作链接的末尾。
  • 是的 - 很好发现。我决定一次进行一项更改,只是为了使更改更清晰。第一个变化只是展示了如何使用 ViewData。我的最后一个代码 sn -p 展示了如何在不传递设备 ID 的情况下初始化表单,而是使用隐藏字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 2018-04-19
  • 1970-01-01
  • 2015-08-16
  • 2014-07-14
  • 1970-01-01
相关资源
最近更新 更多