图片提交按钮适用于 Chrome,但不适用于火狐浏览器?



我有以下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;
    }
}

当单击delete时,应调用以下动作方法

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

这是完美的工作与Chrome,但当提交按钮在Firefox中点击我的动作方法Delete()不调用。

你知道我做错了什么吗?

每个HTML规范,<input name="action" type="image">,当点击时,发送表单参数名为action.xaction.y,但不发送一个名为action。Firefox遵循该规范,而Chrome没有。

您的服务器端代码似乎明确地检查action,虽然,这就是为什么它不能在Firefox中工作。

一些浏览器以不同的方式发送值。所以,除了使用普通的请求,你必须更深入地挖掘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;
    }
}

最新更新