web-dev-qa-db-ja.com

AJAX ASP.NET MVCコントローラーアクションに設定される属性)に関連する属性はありますか?

AJAXの呼び出しで部分ビューをASP.NET MVCで使用したいのですが、これが初めてです。事前に知っておくべき特別なことがないか検索してみました、そして私が興味を持っていることの1つは、設定する必要がある、またはAJAX呼び出しに関連する特別な属性があるかどうかです。[ChildActionOnly]または[HttpGet]

44
Saeed Neamati

Ajaxの組み込み属性はないと思いますが、作成するのはそれほど難しくありません。あなたはAjaxOnlyフィルターを作成することができます

public class AjaxOnlyAttribute : ActionMethodSelectorAttribute 
    {
        public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
        {
            return controllerContext.RequestContext.HttpContext.Request.IsAjaxRequest();
        }
    }

そしてあなたのようなアクションメソッドを飾ります

[AjaxOnly]
public ActionResult ajaxMethod()
{

}

この属性を実装する別の方法については this post を参照してください

81

ASP.NET MVCは、リクエストがAjaxリクエストであるかどうかをチェックする拡張メソッドを提供します。これを使用して、通常のビューの代わりに部分ビューまたはJSON結果を返すかどうかを決定できます。

if (Request.IsAjaxRequest())
{
    return PartialView("name");
}
return View();

アクションメソッドをAjax呼び出しのみに制限するには、カスタム属性を記述します。通常のリクエストの場合、このフィルターは404 not found http例外を返します。

[AttributeUsage(AttributeTargets.Method)]
public class AjaxOnlyAttribute : ActionFilterAttribute
{
     public override void OnActionExecuting(ActionExecutingContext filterContext)
     {
        if (!filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.HttpContext.Response.StatusCode = 404;
            filterContext.Result = new HttpNotFoundResult();
        }
        else
        {
            base.OnActionExecuting(filterContext);
        }
     }
}

あなたはそれをそのように使うことができます:

[AjaxOnly]
public ActionResult Index() {
    // do something awesome
}
18
tehshin

Muhammadの回答のスピンオフで、ajaxリクエストであってはならないことも指定できます。

using System.Web.Mvc;
public class AjaxAttribute : ActionMethodSelectorAttribute
{
    public bool ajax { get; set; }
    public AjaxAttribute() { ajax = true; }
    public AjaxAttribute(bool a) { ajax = a; }
    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
    {
        return ajax == controllerContext.HttpContext.Request.IsAjaxRequest();
    }
}

これにより、次のようなことができます...

[Ajax]
public PartialViewResult AjaxUpdatingPage() {
    return PartialView();
}

[Ajax(false)]
public ViewResult NotAjaxUpdatingPage() {
    return View();
}
4
Pluto

ASP.NET MVC 3 Futuresコレクションには、[AjaxOnly]属性が提供されています。これは、ASP.NET MVCの将来のバージョンに正式に含まれる前に機能を提供する公式のASP.NET MVC Codeplex サイトの一部です。

あなたはそれをダウンロードすることができます ここ 。これを使用するには、リリースパッケージに含まれているMicrosoft.Web.Mvcアセンブリへの参照を追加します。

this ページの属性の説明と、使用できる他のすべての優れた機能があります。

3
Xcalibur

私の解決策は[ChildActionOnly]実装:

public class AjaxOnlyAttribute : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
            throw new ArgumentNullException("filterContext");
        if (!filterContext.HttpContext.Request.IsAjaxRequest())
            throw new InvalidOperationException(string.Format(
                CultureInfo.CurrentCulture, 
                "The action '{0}' is accessible only by an ajax request.", 
                filterContext.ActionDescriptor.ActionName
            ));
    }
}
2
sanjuro

.NET Coreソリューションをお探しの方は、IsAjaxRequest()が利用できなくなったため、少し複雑になります。

以下は、いくつかのプロジェクトで本番環境で使用して大きな効果を得たコードです。

public class AjaxOnlyAttribute : ActionMethodSelectorAttribute
{
  public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor actionDescriptor)
  {
    if(routeContext.HttpContext.Request.Headers != null &&
      routeContext.HttpContext.Request.Headers.ContainsKey("X-Requested-With") &&
      routeContext.HttpContext.Request.Headers.TryGetValue("X-Requested-With", out StringValues requestedWithHeader))
    {
      if(requestedWithHeader.Contains("XMLHttpRequest"))
      {
        return true;
      }
    }

    return false;
  }
}
0
pimbrouwers