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”,则可以正常使用。但是,我想使用图像类型
已邀请:

bab

根据规格: 当定点设备用于 点击图片,表格是 提交和点击坐标 传递给服务器。 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, 0, 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设置样式,但我宁愿使用图像类型,仅用于语义。

要回复问题请先登录注册