AJAXの呼び出しで部分ビューをASP.NET MVCで使用したいのですが、これが初めてです。事前に知っておくべき特別なことがないか検索してみました、そして私が興味を持っていることの1つは、設定する必要がある、またはAJAX呼び出しに関連する特別な属性があるかどうかです。[ChildActionOnly]
または[HttpGet]
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 を参照してください
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
}
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();
}
私の解決策は[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
));
}
}
.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;
}
}