Czy jest jakiś atrybut odnoszący się do AJAX do Ustawienia dla ASP.NET działania kontrolera MVC?

Chcę używać częściowych widoków z wywołaniami AJAX w ASP.NET MVC i pierwszy raz go używam. Po prostu szukałem, aby zobaczyć, czy jest coś specjalnego powinienem wiedzieć wcześniej, i jeden z nich, że jestem ciekawy, jest, aby zobaczyć, czy istnieje jakiś specjalny atrybut, który powinien być ustawiony lub jest związane z wywołaniami AJAX? Coś w stylu [ChildActionOnly] LUB [HttpGet]

Author: Saeed Neamati, 2011-07-02

6 answers

Myślę, że nie ma wbudowanego atrybutu dla ajax, ale nie jest zbyt trudne do stworzenia. możesz utworzyć filtr AjaxOnly jak

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

I ozdobić swoje metody działania jak

[AjaxOnly]
public ActionResult ajaxMethod()
{

}

Spójrz na Ten post dla innego sposobu implementacji tego atrybutu

 75
Author: Muhammad Adeel Zahid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-02 19:12:17

ASP.NET MVC zapewnia metodę rozszerzenia, aby sprawdzić, czy żądanie jest żądaniem Ajax. Możesz go użyć, aby zdecydować, czy chcesz zwrócić widok częściowy lub wynik json zamiast widoku normalnego.

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

Aby ograniczyć metodę działania tylko do wywołań Ajax, można napisać własny atrybut. W przypadku normalnego żądania filtr zwróci wyjątek 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);
        }
     }
}

Możesz go używać w ten sposób:

[AjaxOnly]
public ActionResult Index() {
    // do something awesome
}
 15
Author: tehshin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-21 16:42:06

Spin off odpowiedzi Mahometa pozwalający określić, że nie może to być również żądanie 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();
    }
}
To pozwala Ci robić takie rzeczy...
[Ajax]
public PartialViewResult AjaxUpdatingPage() {
    return PartialView();
}

[Ajax(false)]
public ViewResult NotAjaxUpdatingPage() {
    return View();
}
 4
Author: Pluto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-09 22:43:10

Istnieje [AjaxOnly] atrybut podany w ASP.NET MVC 3 Futures collection. To część oficjalnej ASP.NET MVC Codeplex strona, która udostępnia funkcje, zanim zostaną oficjalnie włączone do przyszłej wersji ASP.NET MVC.

Możesz go pobrać tutaj. Aby go użyć, Dodaj odniesienie do Microsoft.Www.Montaż Mvc zawarty w pakiecie release.

Istnieje wyjaśnienie atrybutu na tej stronie, wraz ze wszystkimi innymi wspaniałymi funkcjami, których możesz użyć.

 3
Author: Xcalibur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-18 03:33:34

Moje rozwiązanie podąża za [ChildActionOnly] implementacją:

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
Author: sanjuro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-06 13:23:01

Dla tych, którzy szukają rozwiązania. NET Core jest to trochę bardziej zaangażowane, ponieważ IsAjaxRequest() nie jest już dostępna.

Poniżej znajduje się kod, który wykorzystałem w produkcji w kilku projektach.

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
Author: pimbrouwers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-14 14:34:04