2011-12-20 86 views
3

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

是否有一些属性可以在提交按钮上进行设置,以便让它在点击和使用回车键的情况下工作?

这里是我的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结果),而不是分页数据。

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

我希望这是有道理的。

回答

3

所以,我研究了这个昨晚,几乎到了某个地方。然后今天早上,我真的到了某个地方,而这里是我结束的地方。

显然,当提交表单时,表单提交的W3C standards相当宽松,因为它涉及到输入按钮和提交表单。看起来他们确定

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

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

我遇到的问题或多或少是'IE'唯一的,只有当窗体包含一个单行文本输入控件时。无论出于何种原因,微软决定,当IE提交这样的表单时,它不包括邮件正文中的提交按钮的名称/值对。但是,如果用户单击提交按钮,则它包含按钮的名称/值对 - - 使用回车键,并且该表单包含多个单行文本输入控件。

所以,唯一的解决办法我能想到的或寻找建议是第二单行文本输入的样式添加到我的表单,然后设置为

visibility:hidden的;显示:无;

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

因此,我们的工作是ASP.NET开发人员发现的。看起来ASP.NET/Web窗体需要键/值对来触发点击事件,所以这个解决方法并不是什么新东西,尽管不是我最喜欢的做事方式。

4

我不会依赖这个。这种情况下存在大量的记录错误。为什么不只是添加一个隐藏字段name='submit'?这样,重新编码后端就不会太难。

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

我不确定这会用于我所需要的。我正在使用一个示例,其中一个模型的属性与提交输入控件的名称相同。当按钮被点击时,当MVC模型绑定到表单时,该属性有一个值。你可以在这里看到一个完整的例子http://unboxedsolutions.com/sean/archive/2011/03/30/15977.aspx – 2011-12-20 22:24:28

+0

有趣。顺便说一句,这个问题是否发生在每个浏览器?至于解决方案,您可以尝试完全覆盖submit事件,并确保提交按钮值正在传递。我不知道这是否会奏效,因为我不熟悉MVC-3和ASP。 – 2011-12-20 22:33:53

+0

我不明白为什么您需要区分在文本字段中使用回车键并使用提交按钮。至少从客户端代码来看并不明显。如果服务器端处理程序在表单数据中需要特定的名称=值对,那么将其包含在隐藏字段中并省略提交按钮中的“name”属性是最安全的。 – 2011-12-20 23:21:09

相关问题