Подтвердить что ты не робот

Есть ли атрибут, связанный с AJAX, который должен быть установлен для действий контроллера ASP.NET MVC?

Я хочу использовать частичные представления с вызовами AJAX в ASP.NET MVC, и это первый раз, когда я его использую. Я просто искал, есть ли что-то особенное, что я должен знать заранее, и один из них, который мне интересен, - это увидеть, есть ли какой-либо специальный атрибут, который должен быть установлен или связан с вызовами AJAX? Что-то вроде [ChildActionOnly] или [HttpGet]

4b9b3361

Ответ 1

Я не думаю, что для 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()
{

}

Посмотрите этот пост для другого способа реализации этого атрибута

Ответ 2

ASP.NET MVC предоставляет метод расширения, чтобы проверить, является ли запрос Request Ajax. Вы можете использовать его, чтобы решить, хотите ли вы вернуть частичный вид или результат json вместо обычного вида.

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

Чтобы ограничить метод действий для вызовов Ajax, вы можете написать собственный атрибут. В случае обычного запроса этот фильтр вернет 404 не найденное исключение 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
}

Ответ 3

В коллекции ASP.NET MVC 3 Futures представлен атрибут [AjaxOnly]. Это часть официального сайта ASP.NET MVC Codeplex, который предоставляет функции, прежде чем они будут официально включены в будущую версию ASP.NET MVC.

Вы можете скачать здесь. Чтобы использовать его, добавьте ссылку на сборку Microsoft.Web.Mvc, включенную в пакет выпуска.

Существует объяснение атрибута на странице this вместе со всеми другими замечательными функциями, которые вы можете использовать.

Ответ 4

Ответ на вопрос Мухаммада, позволяющий указать, что он также не должен быть 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();
}

Ответ 5

мое решение следует за реализацией [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
            ));
    }
}