是否有任何有关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 )); } }