【问题标题】:reading hidden field value in action?在行动中读取隐藏字段值?
【发布时间】:2023-03-09 09:08:01
【问题描述】:

在 MVC-4 Razor 视图中,我有一个包含 2 列的 html 表。第一列显示一个字段并将其存储为隐藏字段。表格的第二列有一个<a>,点击它会重定向到其他一些控件和操作。

<tbody>
    @foreach (var row in Model.Conversions)
    {
     <tr>
    <td>@(Html.DisplayFor(m => row.LastUpdatedDate))
         @(Html.Hidden("DateFrom",@row .LastUpdatedDate))
    </td>
    <td><a href="@Url.Action("ExchangeRateDetails", "ExchangeRate", new { currencyCode = @row.CurrencyCodeFromTo })">+</a>
    </td>
    </tr>
    }
</tbody>

内部操作我正在尝试读取隐藏字段值,但它为空。这是我的代码:

public virtual ActionResult ExchangeRateDetails(string currencyCode)
        {

            var dat = Request.Form["DateFrom"];

}

问题:

我发现隐藏字段值为空。我的期望是它应该具有来自隐藏字段的价值。我不能将此值作为查询字符串传递。您能否指导并帮助我如何读取隐藏字段值?

非常感谢您的指导和帮助。

谢谢

【问题讨论】:

  • 您不能使用Request.Form,因为您没有在上面发布的代码中提交表单。您实际上是在为您的用户提供与您生成的每一行相关联的&lt;a-href&gt; 标签。单击该链接应not-submit 表单但re-directs 页面。

标签: c# .net asp.net-mvc-4 razor


【解决方案1】:

使用表单集合

[HttpPost]
public virtual ActionResult ExchangeRateDetails(FormCollection collection,string currencyCode)
{
     string value = Convert.ToString(collection["DateFrom"]);
     ...
     return View();
}   

以及为什么你使用@(然后是hidenfield?请改变它,删除html.hidden之前的'()'

 @Html.Hidden("DateFrom",@row .LastUpdatedDate)

编辑

并在您的锚标记中添加 form="Post"

喜欢

<a href="@Url.Action("ExchangeRateDetails", "ExchangeRate", new { currencyCode = @row.CurrencyCodeFromTo **,form="post"**})">+</a>

它对我有用。如果您通过上面编辑的代码在锚标记中添加 form="Post" ,那么您不需要任何其他更改,您的代码始终可以处理这个小改动。

【讨论】:

  • 在 Url 中传递 &form=post 会导致如此奇怪的副作用?我不相信。您能否提供一个指向生成的 html 的 jsfiddle 链接来证明这个概念?
【解决方案2】:

Html.Hidden(...) 生成一个隐藏的&lt;input&gt;&lt;input&gt; 值仅在您提交表单时发送到服务器(通过单击&lt;input type="submit"/&gt;)。

在您的情况下,您正在创建指向另一个操作的超链接。当用户点击它时,他将转到指定的 URL,他不会提交当前的表单。

您应该将您的超链接变成一个提交按钮并使其提交一个表单到您想要的操作,或者(在您的示例中更容易做到)将字段值包含到 URL 中:

<td><a href="@Url.Action("ExchangeRateDetails", "ExchangeRate", new { currencyCode = row.CurrencyCodeFromTo, DateFrom = row.LastUpdateDate })">+</a>

编辑:这是一个使用表单而不是超链接的解决方案:

<tbody>
    @foreach (var row in Model.Conversions)
    {
     <tr>
        @using (Html.BeginForm("ExchangeRateDetails", "ExchangeRate"))
        {
            <td>@Html.DisplayFor(m => row.LastUpdatedDate)
                @Html.Hidden("DateFrom", row.LastUpdatedDate)
                @Html.Hidden("currencyCode", row.CurrencyCodeFromTo)
            </td>
            <td>
                <input type="submit" value="+" />
            </td>
        }
    </tr>
    }
</tbody>

如果您想保留超链接而不是按钮,您也可以这样做,但是您必须编写一些 JavaScript 来在用户单击链接时提交表单。 或者,您可以重新设置提交按钮的样式,使其看起来像一个超链接。

【讨论】:

  • 如果视图有很多隐藏字段和很多字段,那么他需要向动作方法发送很多参数吗?对吗?
  • 在这种情况下,最好将超链接转换为提交按钮,就像我也建议的那样。
  • 他可以吗?一个表单可以有多个提交按钮吗?
  • @Zruty,谢谢。正如我在问题中解释的那样,我不能在查询字符串中包含这个字段。您能否指导我如何将其转换为表单/提交按钮,您提到的其他解决方法?
  • 但是如果他不喜欢按钮,如果他只想链接按钮,我们怎么办?发送太多参数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多