Заголовок X-Requested-With
возвращает строку, которая указывает, является ли это Ajax-запросом или нет.Для Ajax-запроса этот заголовок будет иметь значение XMLHttpRequest
.Это значение заголовка не будет присутствовать для обычных запросов GET и POST (не-Ajax-запросов).
Таким образом, вы можете просто написать атрибут как:
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;
}
}
Затем использовать это как:
[AjaxOnlyAttribute]
public IActionResult Search()
{
return PartialView();
}
Или вы можете напрямую проверить это в определенном действии:
string method = HttpContext.Request.Method;
string requestedWith =
HttpContext.Request.Headers["X-Requested-With"];
if (method == "POST")
{
if (requestedWith == "XMLHttpRequest")
{
// code goes here
}
}