【问题标题】:HTML form doesn't contain a form submit button name when using the Enter key使用 Enter 键时,HTML 表单不包含表单提交按钮名称
【发布时间】:2012-01-24 20:08:18
【问题描述】:

我的 ASP.NET MVC 3 网站在服务器端有代码,用于检查单击以提交表单的提交按钮的名称。当我使用鼠标单击按钮时代码有效,但是当我使用 Enter 键时,表单被发布,但请求不包含提交按钮的名称。

我可以在提交按钮上设置一些属性来让它在点击和使用 Enter 键时都能正常工作吗?

这是我的 HTML:

<div>Search:</div>
  <form action="/Item/Search" method="post">
    <input class="fulltextsearch" id="FTSearchText" name="FTSearchText" type="text" value="" />
     <input type="submit" value="Go" name="FTSearchButton" />
  </form>
</div>

在服务器端,我有一个自定义模型绑定器,它使用以下代码来确定用户是否单击了提交按钮。

        // See if the value provider has the required prefix
        var hasPrefix = bindingContext.ValueProvider.ContainsPrefix(bindingContext.ModelName);
        var searchPrefix = (hasPrefix) ? bindingContext.ModelName + "." : string.Empty;

        var searchButton = GetValue(bindingContext, searchPrefix, "FTSearchButton");
        // If this value doesn't have value, the user didn't click the button so exit
        if (string.IsNullOrEmpty(searchButton)) {
            return null;
        }

    private static string GetValue(ModelBindingContext context, string prefix, string key) {
        var result = context.ValueProvider.GetValue(prefix + key);
        return result == null ? null : result.AttemptedValue;
    }

这是我遇到的问题。我有一个显示项目列表的页面。我在 HTML 表单中有一个“搜索”文本框和一个提交按钮。当用户在文本框中输入文本并单击搜索按钮或使用回车键时,页面通过 HTML GET 发布表单数据,并返回找到的前八条记录。然后该页面显示其他页面的页面链接。问题是当用户单击页面链接时,表单数据全部为空白,并且我的过滤器信息丢失(使用这些链接时表单未与表单值一起发布)。所以,我最终显示了一个空白的项目列表(空白搜索返回零结果),而不是分页数据。

通过在我的表单数据中添加对按钮名称的检查,我可以确定是简单地分页数据还是重新查找。

【问题讨论】:

    标签: html forms asp.net-mvc-3


    【解决方案1】:

    我不会依赖这个。这种情况下有很多记录在案的错误。只需使用name='submit' 添加一个隐藏字段。这样重新编码后端就不会太难了。

    <input type='hidden' name='submit' value='FTSearchButton'/>
    

    【讨论】:

    • 我不确定这是否能满足我的需要。我正在使用一个示例,其中模型具有与提交输入控件同名的属性。单击按钮时,当 MVC 模型绑定到表单时,该属性具有一个值。你可以在这里看到一个完整的例子unboxedsolutions.com/sean/archive/2011/03/30/15977.aspx
    • 有趣。顺便说一句,每个浏览器都会出现这个问题吗?至于解决方案,您可以尝试完全覆盖提交事件,并确保正在传递提交按钮值。我不知道这是否可行,因为我既不熟悉 MVC-3 也不熟悉 ASP。
    • 我不明白为什么您需要区分在文本字段中使用回车键和使用提交按钮。至少从客户端代码来看并不明显。如果服务器端处理程序需要表单数据中的特定名称=值对,那么将其包含在隐藏字段中并省略提交按钮中的“名称”属性是最安全的。
    • @JukkaK.Korpela 它与页面发帖时的值有关。单击按钮时,表单值将包含按钮的“名称”。如果页面通过其他方式发出获取请求或发布,则表单数据将包含按钮的空值。
    • @JukkaK.Korpela - 您评论道,“我不明白为什么您需要区分在文本字段中使用回车键和使用提交按钮。”。我不需要区分这两者。我需要相反的。然后我需要在服务器端显示相同。现在,他们是有区别的。我需要区分在文本字段中使用回车键的用户和使用分页链接的用户。
    【解决方案2】:

    所以,我昨晚研究了这个,几乎找到了某个地方。然后今天早上,我确实到达了某个地方,这就是我最终到达的地方。

    显然,用于提交表单的W3C standards 在描述与 Enter 按钮和提交表单相关的功能时相当松懈。看来他们决定了

    当表单中只有一个单行文本输入字段时,用户代理应接受该字段中的 Enter 作为提交表单的请求。

    这为浏览器制造商留下了很大的回旋余地。如今,几乎所有浏览器都支持使用 Enter 键提交表单,无论该表单是否包含一个或多个单行文本输入框。

    我遇到的问题或多或少是Internet Explorer 独有的,并且仅当表单包含一个单行文本输入控件时。无论出于何种原因,Microsoft 决定当 Internet Explorer 提交这样的表单时,它不会在帖子正文中包含提交按钮的名称/值对。但是,如果用户单击提交按钮 -- -- 使用 Enter 键,它确实包含按钮的名称/值对,并且表单包含多个单行文本输入控件。

    所以,我能想到或找到建议的唯一解决方案是在我的表单中添加第二个单行文本输入,然后将样式设置为

    visibility: hidden; display: none;
    

    我的表单现在有两个单行文本输入控件,因此无论用户是否使用 Enter 键或点击提交按钮。

    因此,我们有一个由 ASP.NET 开发人员发现的解决方法。似乎 ASP.NET 网络表单需要键/值对来触发点击事件,所以这种解决方法并不是什么新鲜事,尽管不是我最喜欢的做事方式。

    【讨论】:

      猜你喜欢
      • 2015-03-07
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      相关资源
      最近更新 更多