是否有任何有关ASP.NET MVC控制器操作设置的AJAX属性?

我想在ASP.NET MVC中使用AJAX调用的部分视图,这是我第一次使用它。 我刚刚search了一下,是否有什么特别的东西我应该事先知道,而我很好奇的其中一个,是看有没有什么特别的属性需要设置或者与AJAX调用有关? 像[ChildActionOnly][HttpGet]

我不认为有ajax属性的内置,但它不难创build一个。 你可以像创buildAjaxOnlyfilter一样

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

并装饰你的行动方式

 [AjaxOnly] public ActionResult ajaxMethod() { } 

看看这个post的另一种实现这个属性的方法

ASP.NET MVC提供了一个扩展方法来检查一个请求是否是一个Ajax请求。 您可以使用它来决定是否要返回部分视图或json结果而不是普通视图。

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

要将操作方法​​限制为Ajax调用,只能编写自定义属性。 在正常请求的情况下,这个filter将返回一个404找不到httpexception。

 [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 } 

ASP.NET MVC 3 Futures集合中提供了[AjaxOnly]属性。 它是官方的ASP.NET MVC Codeplex站点的一部分,它在官方包含在将来的ASP.NET MVC版本中之前提供了一些function。

你可以在这里下载。 要使用它,请添加对发行包中包含的Microsoft.Web.Mvc程序集的引用。

这个页面上有一个属性的解释,以及你可以使用的所有其他强大的function。

穆罕默德答案的衍生,让你指定它也不能是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(); } 

我的解决scheme遵循[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 )); } }