我有以下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()不会被调用。
任何想法我做错了什么?
答案 0 :(得分:1)
根据HTML规范<input name="action" type="image">
,点击后,会发送名为action.x
和action.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;
}
}