Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 是否要为ASP.NET MVC控制器操作设置任何与AJAX相关的属性?_Asp.net Mvc_Asp.net Mvc 3_Attributes_Aop - Fatal编程技术网

Asp.net mvc 是否要为ASP.NET MVC控制器操作设置任何与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

我想在ASP.NET MVC中使用部分视图和AJAX调用,这是我第一次使用它。我只是想看看是否有什么特别的东西我应该事先知道,其中一个我很好奇的是,看看是否有任何特别的属性应该设置或与AJAX调用相关?类似于
[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用于提供可应用于整个控制器的实现(而不是将其单独应用于每个动作方法,这可能会造成很大的压力)。