【问题标题】:Why IsAjaxRequest is deprecated in ASP.Net Core为什么在 ASP.Net Core 中不推荐使用 IsAjaxRequest
【发布时间】:2017-08-08 05:09:24
【问题描述】:

有人告诉我为什么在 ASP.Net Core 中不推荐使用 IsAjaxRequest 或者有什么替代功能。

我在我的项目中使用了这个功能分配现在我想升级到 ASP.Net Core

        if (Request.IsAjaxRequest())
        {
            return PartialView("index2", VMJob);
        }
        return View(VMModel);

有一个解决方法:Where is Request.IsAjaxRequest() in Asp.Net Core MVC?

但我想知道 ASP.Net 核心中是否有任何内置函数

【问题讨论】:

  • 不再需要它了,因为随着 ASP.NET 到 ASP.NET Core 的重写,WebAPI 和 MVC 现在是同一个 API。在一个动作中混合 MVC 和 WebAPI 也是一种不好的做法,因为 MVC 使用 Controller + Action + Http Verb 而 WebAPI 仅使用控制器 + Http Verb(动作名称不用于标识 WebAPI 路由),即 POST /Home/User/1/Edit 在 MVC vs .POST/PUT /api/Home/User/and 前者不是格式良好的 REST uri/route。还要记住,ASP.NET MVC 是在 WebAPI 存在之前创建的
  • 如何在asp.net core中处理上面的ajax请求
  • 干净的方式:做两个端点,一个用于 Ajax 一个用于 mvc。肮脏的方式,使用链接的文章
  • 您是否有示例代码将其发布为答案以便我检查?对我有用与否
  • @Tseng WebAPI 并不是需要这样做的唯一原因。基于 SPA 的网络应用程序比以往任何时候都更需要这个。只需重新创建扩展,使用 MVC5 的原始代码

标签: asp.net asp.net-core


【解决方案1】:

有一种方法可以限制您的操作方法只响应 ajax 请求:

public class AjaxOnlyAttribute : ActionMethodSelectorAttribute
{
    public override bool IsValidForRequest(RouteContext routeContext, 
        ActionDescriptor action)
    {
        HttpRequest request = routeContext.HttpContext.Request;
        if (request == null)
        {
            return false;
        }

        if (request.Headers != null)
        {
            return request.Headers["X-Requested-With"] == "XMLHttpRequest";
        }

        return false;
    }
}

然后在你的控制器中:

[Route("api/[controller]")]
public class UsersController : Controller
{
    [HttpGet]
    [AjaxOnly]
    public IActionResult GetAll()
    {
        return Ok(new[]
        {
            new UserDto{Id = 1, Name = "John"},
            new UserDto{Id = 2, Name = "Snow"}
        });
    }

    private class UserDto
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

这样您可以创建两种单独的操作方法,一种用于您的 ajax 请求,另一种用于标准的完整页面重新加载。

【讨论】:

  • 嗯,这个想法是,当您使用 AjaxOnly 属性标记您的操作方法并且请求不是 ajax 时,例如您直接在浏览器中键入 localhost/api/users,这不是 ajax,操作方法不会解决。此外,它还向您展示了缺少 IsAjaxRequest 方法的解决方法以及如何检查该方法是否为 ajax。
猜你喜欢
  • 2016-02-23
  • 2017-11-04
  • 2011-10-22
  • 2011-04-11
  • 2021-10-12
  • 2012-12-07
  • 2012-05-16
  • 2020-06-29
  • 2014-08-11
相关资源
最近更新 更多