如何解决Internet Explorer中是否存在输入类型为“ image”的错误
| 我目前正在使用IE9(rtm),我想知道这是我自己做的问题还是Internet Explorer 9中的错误。 我正在使用ASP.NET MVC,将表单控制器定义为:[HttpPost()]
[UrlRoute(Path = \"Checkout/Cart\")]
public ActionResult Cart(ShoppingCartModel cart,string submitButton)
所有浏览器都会导致这种方法在回发时被点击。输入类型的详细信息如下:
<input type=\"image\" src=\"/resources/images/removeselected.png\" class=\"rightButton removeSelected\" alt=\"Remove Selected\" name=\"submitButton\" value=\"<%= Html.Encode(Model.REMOVE_SELECTED) %>\" />
这是用表格发回的内容:
铬:
CartId = 241&submitButton.x = 83&submitButton.y = 12&submitButton = removeSelected&Items%5B0%5D.Selected = true&Items%5B0%5D.Selected = false&Items%5B0%5D.OrderItemId = 76&Items%5B0%5D.Product.ID = 9611&s 5D.Quantity = 1
Internet Explorer 9:
CartId = 244&Items%5B0%5D.Selected = true&Items%5B0%5D.Selected = false&Items%5B0%5D.OrderItemId = 77&Items%5B0%5D.Product.ID = 10091&Items%5B0%5D.Quantity = 1&submitButton.x = 27&submitButton。 y = 8
如您所见,Chrome排在submitButton=removeSelected
中,而IE不是。它在Firefox中也可以正常工作。
如果我将其更改为“ 3”,则可以正常使用。但是,我想使用图像类型解决方法
根据规格:
当定点设备用于
点击图片,表格是
提交和点击坐标
传递给服务器。 x值是
以像素为单位,从左侧开始测量
图片,以及以像素为单位的y值
从图片顶部开始。的
提交的数据包括name.x = x值
和name.y = y-value,其中\“ name \”是
名称属性的值,以及
x值和y值分别是x和y
坐标值。
您不能期望更多。 IE不会发送
submitButton=removeSelected
,是的,但是根据规范,没有义务这样做。因此,您不应依赖此参数。其他浏览器正在发送它的事实可能只是实现细节(您当然不应该依赖它)。
解决方法是使用普通的提交按钮,然后尝试使用CSS设置样式。,这是我如何解决这个问题的方法;希望其他人可能会对我的解决方案有所帮助。
消息签名更改;参数是所有各种表单按钮名称的列表。 Chrome / FF将填写这些名称,因此您无需解析它。
[HttpPost()]
[UrlRoute(Path = \"Checkout/Cart\")]
public ActionResult Cart(ShoppingCartModel cart,string removeSelected,string nextButton)
{
if (removeSelected == ShoppingCartModel.REMOVE_SELECTED)
removeOp = true;
else if (nextButton == ShoppingCartModel.NEXT_BUTTON)
nextOp = true;
else
{
PostbackButtonParser parser = new PostbackButtonParser(HttpContext.Request.InputStream,new string[] { ShoppingCartModel.NEXT_BUTTON,ShoppingCartModel.REMOVE_SELECTED });
if (parser.PostbackButtonName == ShoppingCartModel.NEXT_BUTTON)
nextOp = true;
else if (parser.PostbackButtonName == ShoppingCartModel.REMOVE_SELECTED)
removeOp = true;
}
if(removeOp) { /* do something */ }
else if (nextOp) { /* do something */ }
}
然后,PostbackButtonParser的代码非常简单:
/// <summary>
/// Implements a fallback rollover for Internet Explorer and other browsers which don\'t send the value with an INPUT TYPE=\"IMAGE\" submit.
/// </summary>
/// <example>
/// PostbackButtonParser parser = new PostbackButtonParser(HttpContext.Request.InputStream,new string[] { \"button1\",\"button2\" });
/// if(parser.PostbackButtonName == \"button1\") {
/// // do something
/// }
/// else if (parser.PostbackButtonName == \"button2\" {
/// // do something else
/// }
/// </example>
/// <remarks>See http://stackoverflow.com/questions/5716260/is-there-a-bug-with-input-type-image-in-internet-explorer</remarks>
public class PostbackButtonParser
{
/// <summary>
/// Gets the name of the button which caused the postback.
/// </summary>
public string PostbackButtonName
{
get;
private set;
}
/// <summary>
/// Creates a new instance of the postback button parser
/// </summary>
/// <param name=\"requestStream\">The stream to process</param>
/// <param name=\"buttonNames\">An array of button names to evaluate gainst</param>
public PostbackButtonParser(Stream requestStream,string[] buttonNames)
{
byte[] stream = new byte[requestStream.Length];
requestStream.Read(stream,stream.Length);
string contents = System.Text.Encoding.ASCII.GetString(stream);
for (int i = 0; i < buttonNames.Length; i++)
{
// Set first match
if (contents.Contains(buttonNames[i] + \".x\") && contents.Contains(buttonNames[i] + \".y\"))
{
PostbackButtonName = buttonNames[i];
break;
}
}
}
}
我真的希望这对某人有帮助。我花了几个小时去研究那些本来应该微不足道的东西。达林说的是真的,我本可以为a设置样式,但我宁愿使用图像类型,仅用于语义。版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。