图片提交按钮适用于Chrome,但不适用于Firefox?

时间:2013-06-14 07:41:38

标签: google-chrome firefox post asp.net-mvc-4 custom-attributes

我有以下HTML:

<input type="image" src="/Images/actions/Delete.gif" alt="Delete" title="Delete" name="action" value="Delete"/>

在我的控制器中,我有以下自定义属性

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultiButtonAttribute : ActionNameSelectorAttribute
{
    public string MatchFormKey { get; set; }
    public string MatchFormValue { get; set; }
    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        return controllerContext.HttpContext.Request[MatchFormKey] != null &&
            controllerContext.HttpContext.Request[MatchFormKey] == MatchFormValue;
    }
}

单击删除时应调用以下操作方法

    [HttpPost]
    [MultiButton(MatchFormKey = "action", MatchFormValue = "Delete")]
    public ActionResult Delete(MessageModel model)
    {
        return Content("Delete clicked");
    }

这与Chrome完美配合,但在Firefox中点击提交按钮后,我的操作方法Delete()不会被调用。

任何想法我做错了什么?

2 个答案:

答案 0 :(得分:1)

根据HTML规范<input name="action" type="image">,点击后,会发送名为action.xaction.y的表单参数,但不会发送名为action的表单参数。 Firefox遵循规范,而Chrome则没有。

但是,您的服务器端代码似乎明确检查action,这就是为什么它在Firefox中不起作用。

答案 1 :(得分:0)

某些浏览器以不同的方式发送值。因此,不必使用正常请求,您必须深入挖掘RouteData,在那里您将找到所有值,包括来自Firefox的值。以下是适用于Chrome,Firefox和IE的自定义属性的修改版本。

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultiButtonAttribute : ActionNameSelectorAttribute
{
    public string MatchFormKey { get; set; }  
    public string MatchFormValue { get; set; } 
    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        if (controllerContext.HttpContext.Request.RequestContext.RouteData.Values[MatchFormKey] != null)
        {
            return (string)controllerContext.HttpContext.Request.RequestContext.RouteData.Values[MatchFormKey] == MatchFormValue;
        }
        return false;
    }
}