如何从<form>标签中获取值?

3

根据我的同事的代码,他在视图中使用BeginForm将HTML属性传递到表单声明中,生成的HTML如下:

<form action="/Reviewer/Complete" ipbID="16743" method="post">

我该如何在控制器代码中获取ipbID?我已尝试过。
HttpContext.Request.QueryString["ipbID"]

... and ...

Request.Form["ipbID"]

我甚至进入调试模式并检查了每个Request.Form的部分,以查看是否存在该值。在表单标记中放置这样的值是否不是一个好习惯?非常感谢您的任何帮助。

更新: 我应该告诉大家,此表单正在应用于单元格。这些单元格位于dataTable中。当我使用时,它返回了隐藏的第一个值,但没有后续的值。

更新2: 视图

<% Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<PTA.Models.IPB>>" %>

<%@ Import Namespace="PTA.Helpers"%>

<b>Assigned IPBs</b>

<script type="text/javascript" charset="utf-8">
  $(document).ready(function() {
    $('#sharedIPBGrid').dataTable();
  });
</script>

<%
if (Model != null && Model.Count() > 0)
{
%>
<table id="sharedIPBGrid" class="display">
  <thead>
    <tr>
      <th>
        <%=Html.LabelFor(m => m.FirstOrDefault().IPBName) %>
      </th>
      <th>
        <%=Html.LabelFor(m => m.FirstOrDefault().Status) %>
      </th>
      <th>
        <%=Html.LabelFor(m => m.FirstOrDefault().PubDate) %>
      </th>
      <th>
        <%=Html.LabelFor(m => m.FirstOrDefault().ChangeDate) %>
      </th>
      <th>
        <%=Html.LabelFor(m => m.FirstOrDefault().Priority) %>
      </th>
      <th>
        <%=Html.LabelFor(m => m.FirstOrDefault().Errors) %>
      </th>
      <th>
        Start
      </th>
      <th>
        Stop
      </th>
      <th>
        Complete
      </th>
    </tr>
  </thead>
  <tbody>
    <tr>
<%
  foreach(IPB ipb in Model)
  {
%>
      //Ignoring everything except for the Complete button as there's a lot of logic in there.
      <td>
<%
         if (ipb.StatusID == (int)PTA.Helpers.Constants.State.InWorkActive)
         {
           using (Html.BeginForm("Complete", "Reviewer", FormMethod.Post, new {ipbID = ipb.ID}))
           {
%>
             <%=Html.Hidden("ipbID", ipb.ID)%>
             <input type="submit" id="btnComplete" value="Complete" />
<%
           }
         }
%>
      </td>
<%
  }
%>
    </tr>
  </tbody>
</table>
<%
}
else
{
  Response.Write("No IPBs found!");
}
%>
1个回答

6

不要像你的同事那样做。 这是错误的。在form标签上没有定义ipbID属性,这意味着你正在生成无效的HTML。此外,表单属性永远不会被提交到服务器,因此您无法获取它们。

我建议您使用隐藏字段,这更为自然。所以,不要使用以下方式:

<form action="/Reviewer/Complete" ipbID="16743" method="post">

尝试:

<form action="/Reviewer/Complete" method="post">
    <input type="hidden" name="ipbID" value="16743" />

接着,Request["ipbID"]或者一个简单的控制器动作参数ipbID将会给你所需的值。


看我的更新。我尝试了隐藏功能,但由于我将表单包装在表格的单元格中,并且我需要该特定行的ipbID,所以它不起作用。它返回第一个ipbID,但如果我选择第五行,我想要第五个ipbID。 - XstreamINsanity
在包含视图数据的IPBGrid.ascx中,我们使用foreach循环遍历ipbs并将ipb.ID应用于每个隐藏语句。如果我逐步执行,它会按照预期进行。我想也许当页面尝试呈现Hidden属性时,它会盲目地将其应用于该列中的所有单元格,第一个单元格。这可能是使用dataTable格式的问题还是HTML问题? - XstreamINsanity
@XstreamINsanity,我完全不知道你在说什么。请提供示例代码。 - Darin Dimitrov
是的,抱歉让你等这么久。我无法从我的开发机器复制和粘贴到网络机器上,而且不允许使用U盘,所以我大部分都是打字输入的。请查看更新2。 - XstreamINsanity
我尝试使用硬编码的隐藏值代替Html.Hidden,它起作用了。不确定为什么,但确实如此。我将您的答案标记为正确答案。谢谢。 - XstreamINsanity
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接