1

同じ名前の2つのアクションを持つコントローラーがありますが、1つはいくつかのパラメーターを受け入れます。それらを明確にするために、一方はGET要求のみを受け入れ、もう一方はPOST要求のみを受け入れます。また、アクションメソッドでAjax呼び出しのみを強制するために使用されるHttpAjaxAttributeもあります。何らかの理由で、このソリューションは信頼できません。インポートアクションへのGETリクエストで、MVCは頑固にPOST / AJAXを選択しようとし、HttpAjaxAttributeからAjax例外をスローします。関連する可能性のある質問を見つけました。属性を特定の順序(HttpGetまたはHttpPost、次にHttpAjax)でアタッチすると問題が解決すると思いましたが、そうではありません。私のウェブサイトはしばらくの間機能していましたが、今は失敗します。私は一見ランダムな時間にこの問題に遭遇しました。どうすれば永久に修正できますか?

コントローラのアクション

[HttpGet]
public ActionResult Import()
 {
     // some code
 }

[HttpPost]
[HttpAjax]
public ActionResult Import(string country, string state, string city, ImportModel[] locations)
{
    // some code
}

HttpAjaxAttribute

/// <summary>
/// Makes the controller action that has this attribute applied accept only Ajax requests.
/// </summary>
public class HttpAjaxAttribute : ActionMethodSelectorAttribute
{
    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
    {
        if (!controllerContext.HttpContext.Request.IsAjaxRequest())
        {
            throw new Exception("The action " + methodInfo.Name + " can only be called via an Ajax request");
        }
        return true;
    }
}
4

2 に答える 2

3

HttpAjaxAttributeから例外をスローするべきではないと確信していますがreturn false、アクションが現在の要求を処理できない場合に限ります。

/// <summary>
/// Makes the controller action that has this attribute applied accept only Ajax requests.
/// </summary>
public class HttpAjaxAttribute : ActionMethodSelectorAttribute
{
    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
    {
        return controllerContext.HttpContext.Request.IsAjaxRequest();
    }
}

MVCは、適切なアクションを見つける前にすべてのアクションを検査しようとします。その中に頑固なものは何もありません。フレームワークに、現在のリクエストに対してアクションが有効かどうかを伝える必要があります。最後に、MVCがHttpGetアクションに到達し、それを選択します。ただし、その前に例外をスローすると、このプロセスが強制的に停止されます。

于 2012-02-23T12:28:50.360 に答える
1

[HttpAjax]属性を追加すると、アクションメソッド、またはコントローラー全体で実行できる操作が制限されます。

グレースフルデグラデーションに関しては、それがAJAXリクエストであるかどうかを確認し、そうである場合は、部分ビュー、JSON、または返したいものを返します。それ以外の場合は、ビュー全体を返す必要があります。

このため、HttpAjax属性を実装しないことをお勧めしますが、アクションメソッドでそれがAjaxRequestであるかどうかを確認してください。

public ActionResult Foo()
{
   if(HttpContext.Request.IsAjaxRequest())
   {
       // Return partial
   }

   // Degrade gracefully

}
于 2012-02-23T12:40:16.790 に答える