使用回车键时,Html表单不包含表单提交按钮名称

时间:2011-12-20 22:07:29

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

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

我是否可以在提交按钮上设置一些属性,以使其同时用于单击和使用回车键?

这是我的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格式的提交按钮。当用户在文本框中输入文本并单击搜索按钮或使用回车键时,页面通过http get发布表单数据,并返回找到的前8个记录。然后页面显示其他页面的页面链接。问题是,当用户单击页面链接时,表单数据全部为空白,并且我的过滤器信息丢失(使用这些链接时,表单不会使用表单值发布)。因此,我最终显示一个空白的项目列表(空白搜索返回0结果),而不是分页数据。

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

我希望这是有道理的。

2 个答案:

答案 0 :(得分:4)

我不会依赖于此。这种情况有很多记录的错误。为什么不添加name='submit'的隐藏字段?这样重新编码后端就不会太难了。

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

答案 1 :(得分:3)

所以,我昨晚研究了这个,几乎到了某个地方。然后今天早上,我确实到了某个地方,而且我到了这里。

显然,在描述与Enter按钮和提交表单相关的功能时,表单提交的W3C standards非常宽松。他们似乎确定了

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

因此,为浏览器制造商留下了很多摆动空间。今天,几乎所有浏览器都支持使用Enter键提交表单,无论表单是否包含一个或多个单行文本输入框。

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

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

能见度:隐藏;显示:无;

我的表单现在有两个单行文本输入控件,因此表单将在表单正文中使用名称/值对进行发布,无论用户是否使用了回车键或单击了提交按钮。

因此,我们所拥有的是ASP.NET开发人员发现的解决方法。 ASP.NET web表单似乎需要键/值对来触发click事件,所以这个解决方案并不是新事物,尽管不是我最喜欢的做事方式。