0

私は次の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() が呼び出されません。

私が間違っていることは何ですか?

4

2 に答える 2

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;
    }
}
于 2013-06-14T08:43:17.787 に答える