Html表单没有';使用enter键时不包含表单提交按钮名称

Html表单没有';使用enter键时不包含表单提交按钮名称,html,forms,asp.net-mvc-3,Html,Forms,Asp.net Mvc 3,我的MVC3网站在服务器端有代码,用于检查单击提交按钮以提交表单的名称。当我使用鼠标单击按钮时,代码会起作用,但当我使用enter键时,表单会被发布,但请求不包含提交按钮的名称 //See if the value provider has the required prefix var hasPrefix = bindingContext.ValueProvider.ContainsPrefix(bindingContext.ModelName);

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

        //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;
    }
我是否可以在submit按钮上设置一些属性,使其在单击和使用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>
编辑 这就是我的问题所在。我有一个显示项目列表的页面。我有一个“搜索”文本框和一个html表单中的提交按钮。当用户在文本框中输入文本并单击搜索按钮或使用enter键时,页面将通过http get发布表单数据,并返回找到的前8条记录。然后,该页面将显示其他页面的页面链接。问题在于,当用户单击页面链接时,表单数据全部为空,并且我的筛选信息丢失(使用这些链接时,表单未使用表单值发布)。因此,我最终显示一个项目的空白列表(空白搜索返回0个结果),而不是分页数据

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


我希望这是有意义的。

我不相信这一点。在这个场景中有很多记录在案的bug。为什么不添加一个带有
name='submit'
的隐藏字段呢?这样就不难对后端重新编码

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

所以,我昨晚研究了一下,几乎找到了答案。然后今天早上,我真的到了某个地方,这就是我的结局

显然,表单提交在描述与Enter按钮和提交表单相关的功能时非常松散。看来他们决定

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

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

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

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

可见性:隐藏;显示:无

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

        //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;
    }

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

我不确定这是否能满足我的需要。我正在使用一个示例,其中一个模型有一个与提交输入控件名相同的属性。单击按钮时,当MVC模型绑定到表单时,该属性具有一个值。你可以在这里看到一个完整的例子。顺便问一下,是否每个浏览器都会出现此问题?至于解决方案,您可以尝试完全覆盖submit事件,并确保传递submit按钮值。我不知道这是否有效,因为我既不熟悉MVC-3也不熟悉ASP。我不明白为什么需要区分在文本字段中使用enter键和使用submit按钮。至少从客户端代码看不明显。如果服务器端处理程序在表单数据中需要特定的name=value对,那么最安全的做法是将其包含在隐藏字段中,并从submit按钮中省略“name”属性。@JukkaK.Korpela这与页面发布时的值有关。单击按钮时,表单值将包含按钮的“名称”。如果页面通过其他方式发出get请求或post,表单数据将包含按钮的null。@JukkaK.Korpela-您评论道,“我不明白您为什么需要区分在文本字段中使用enter键和使用submit按钮。”。我不需要区分这两者。我需要相反的东西。然后,我需要在服务器端显示相同的内容。现在,他们是杰出的。我需要区分在文本字段中使用enter键的用户和使用分页链接的用户。