Asp.net mvc 是否要为ASP.NET MVC控制器操作设置任何与AJAX相关的属性?
我想在ASP.NET MVC中使用部分视图和AJAX调用,这是我第一次使用它。我只是想看看是否有什么特别的东西我应该事先知道,其中一个我很好奇的是,看看是否有任何特别的属性应该设置或与AJAX调用相关?类似于Asp.net mvc 是否要为ASP.NET MVC控制器操作设置任何与AJAX相关的属性?,asp.net-mvc,asp.net-mvc-3,attributes,aop,Asp.net Mvc,Asp.net Mvc 3,Attributes,Aop,我想在ASP.NET MVC中使用部分视图和AJAX调用,这是我第一次使用它。我只是想看看是否有什么特别的东西我应该事先知道,其中一个我很好奇的是,看看是否有任何特别的属性应该设置或与AJAX调用相关?类似于[ChildActionOnly]或[HttpGet]我认为ajax没有内置属性,但您可以创建自己的AjaxOnly过滤器,如下所示: 公共类AjaxOnlyAttribute:ActionMethodSelectorAttribute { 公共覆盖布尔值是有效的请求(ControllerC
[ChildActionOnly]
或[HttpGet]
我认为ajax没有内置属性,但您可以创建自己的AjaxOnly
过滤器,如下所示:
公共类AjaxOnlyAttribute:ActionMethodSelectorAttribute
{
公共覆盖布尔值是有效的请求(ControllerContext ControllerContext,System.Reflection.MethodInfo)
{
返回controllerContext.RequestContext.HttpContext.Request.IsAjaxRequest();
}
}
并像这样装饰你的行动方式:
[AjaxOnly]
公共行动结果AjaxMethod()
{
}
另请参见:有关实现此功能的另一种方法ASP.NET MVC提供了一种扩展方法来检查请求是否是Ajax请求。您可以使用它来决定是否要返回部分视图或json结果,而不是普通视图
if (Request.IsAjaxRequest())
{
return PartialView("name");
}
return View();
要将动作方法限制为仅Ajax调用,您可以编写自定义属性。在正常请求的情况下,此筛选器将返回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);
}
}
}
您可以这样使用它:
[AjaxOnly]
public ActionResult Index() {
// do something awesome
}
ASP.NET MVC 3 Futures集合中提供了一个[AjaxOnly]属性。它是ASP.NET MVC官方网站的一部分,在功能正式包含在未来版本的ASP.NET MVC中之前提供这些功能 你可以下载它。要使用它,请添加对发布包中包含的Microsoft.Web.Mvc程序集的引用
页面上有该属性的说明,以及您可以使用的所有其他重要功能。我的解决方案遵循
[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
));
}
}
Muhammad答案的衍生产品,让您指定它也不能是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();
}
对于那些寻找.NET核心解决方案的人来说,这需要更多的参与,因为
IsAjaxRequest()
不再可用
下面是我在几个项目的生产中使用的代码,效果非常好
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;
}
}
MVC如何知道这实际上是一个AJAX请求。它是否使用一些自定义HTTP头字段?有时候XmlHttpRequest不发送自定义头。它使用
X-Request-With
头,这是由Request.IsAjaxRequest()
方法读取的头。有没有办法用AttributeRouting执行类似的操作?它实现了HttpRouteAttribute。真不敢相信我不是在这里而是在看路由约束+1用于提供可应用于整个控制器的实现(而不是将其单独应用于每个动作方法,这可能会造成很大的压力)。