将 AjaxOnlyAttribute 和 ChildActionOnlyAttribute 组合到一个操作过滤器中

2024-02-21

我希望能够在控制器上标记一个动作,以便通过 ajax 调用和 RenderAction 来调用。问题在于这两个属性派生或实现不同的抽象。一种出路是下一个:

[AjaxOnly]
PartialViewResult GetViewAjax(int foo) { return GetView(foo); }
[ChildActionOnly]
PartialViewResult GetView(int foo) { ... }

但这一点也不整洁。


我所说的 AjaxOnly 属性是:

public sealed class AjaxOnlyAttribute : ActionFilterAttribute
{
    #region Public members

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext == null)
            throw new ArgumentNullException("filterContext");
        if (filterContext.HttpContext.Request.Headers["X-Requested-With"] != "XMLHttpRequest")
            filterContext.Result = new HttpNotFoundResult();
    }

    #endregion
}

该方法取自MVC3 future。一个重要的评论为什么这种情况不是filterContext.HttpContext.Request.IsAjaxRequest()由开发团队制作,内容如下:

// Dev10 #939671 - If this attribute is going to say AJAX *only*, then we need to check the header
// specifically, as otherwise clients can modify the form or query string to contain the name/value
// pair we're looking for.

这没有任何意义。这两个属性是互斥的。如果一个动作被标记为[ChildActionOnly]客户端永远无法使用 HTTP 请求(同步或异步)直接访问它。因此,如果您希望使用 AJAX 可以访问某个操作,则永远不应该用[ChildActionOnly]属性。

我不知道这是什么[AjaxOnly]属性是以及它来自哪里,但根据它的实现方式,如果它仅依赖于Request.IsAjaxRequest()方法。例如,如果是这样的:

public class AjaxOnlyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.Result = new HttpNotFoundResult();
        }
    }
}

你可能想像这样调整它:

public class AjaxOrChildActionOnlyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.Request.IsAjaxRequest() && 
            !filterContext.IsChildAction
        )
        {
            filterContext.Result = new HttpNotFoundResult();
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 AjaxOnlyAttribute 和 ChildActionOnlyAttribute 组合到一个操作过滤器中 的相关文章

随机推荐

  • 在面向 iOS 7 的项目中导入 Alamofire

    我检查了新的 Alamofire 安装步骤 由于我需要针对 iOS 7 0 我想知道是否导入Alamofire swift是否足以使其发挥作用 为什么文档指出将函数包装在Struct Alamofire 是否需要调用命名空间中的函数 在这种
  • SQL 将数据从临时表插入到另外两个表中

    我遇到过这样的情况 将 CSV 上传到我的应用程序 并且每一行基本上都需要放入数据库中 我读取每一行并构建一个数据表 然后 SqlBulkCopy 该表到临时表 暂存表如下所示 UserID GroupID FirstName LastNa
  • 确定日期开始的时间

    假设我想创建一个每日计划表 并且我想将一天分为 15 分钟的部分 容易 对吧 就从午夜开始 然后 错了 在美洲 圣保罗 由于夏令时的变化 每年的某一天从 01 00 开始 给定一个时区和一个日期 如何找到一天开始的纪元时间 我的第一个想法是
  • VB.Net - AssemblyFileVersion 和 AssemblyFileVersionAttribute 以及 AssemblyVersion 和 AssemblyVersionAttribute 之间有什么区别

    我继承了 VB Net 代码库 该代码库是 VB 2005 并升级到 VB 2008 其中包含大约 100 个项目 我正在尝试重新版本所有组件 但发现某些 AssemblyInfo vb 文件具有AssemblyFileVersion条目
  • 如何使 Angular ui 网格最初展开所有行?

    我正在使用 ui 网格来显示数据列表 并且我正在尝试最初展开所有行 我试图在 onRegisterApi 事件中执行此操作 scope GridOptions data properties columnDefs name Full Add
  • 如何将列表中的所有元素划分在一起

    例如 a 1 2 3 4 5 6 我想要做 1 2 3 4 5 6 我尝试过使用operator div函数 但似乎没有给出正确的结果 顺便说一句 我对 python 还很陌生 您可以使用reduce https docs python o
  • 动态“case_when”允许不同数量的条件和条件本身

    我正在寻找一种动态方法来指定一些 条件参数 然后将其提供给case when操作或其他更适合该问题的操作 我的目标是将条件规范与 case when 调用分开 例如这样用户只需在文本文件或 R 中的列表中输入条件 然后我将获取该信息并将其提
  • 防止图像缓存在浏览器中

    我有一个 浏览图片 功能 其中有缩略图 当用户单击它时它会展开 现在 这两个图像都存储在不同大小的单独虚拟目录中 较大的是 200 200 px 当我点击放大时 它仍然只显示较小的图像 而不是 200 200 的图像 您可以将随机 URL
  • Django - 通过模型名称获取 ContentType 模型(通用关系)

    我现在正在思考这个问题一段时间 我正在创建一个聊天应用程序 在 chat models 中指定了 Room 类 但是 Room 可以与我的项目中的任何内容相关 因为它在外键中使用通用关系 有没有办法只知道模型名称就知道 Room 与哪个模型
  • 如何在 MySQL GROUP BY 子句中排序或选择行?

    我有一个这样的表 id number otherfields 664 48 aaa 665 49 bbb 666 55 ccc 667 48 ddd 我的查询分组为number字段 我希望它选择第一个 最低 id 这样数据就出来了ccc a
  • Angularjs - 自定义 $resource

    我用角 resource用于 REST 服务 由于我的 get 响应中的怪癖 我无法将 resource 服务用于 CRUD 应用程序 创建一个新对象work Card的day 类似于 var newCard new CreditCard
  • Newtonsoft 中的 JSON null 处理问题

    我有一个问题null交易时处理Newtonsoft json 我想检查结果是null或不 基于此我想处理一些情况 我的代码如下 try var response GetApiData Post getApiBaseUrl data ToSt
  • Alt+Enter 停止在 IntelliJ 中处理 Dart 文件

    构建 Flutter 应用程序时ALT Enter键盘快捷键非常方便 不仅可以调出快速修复 还可以调出弹出菜单来包装 删除小部件 在我跑步之前它工作得很好flutter upgrade并更新了 IntelliJ 中的 Dart 和 Flut
  • 如何测试Oracle目录的读/写文件系统权限?

    假设您创建一个目录 例如 CREATE OR REPLACE DIRECTORY EXT DATA FILES AS data ext data files GRANT READ WRITE ON DIRECTORY SYS EXT DAT
  • Delphi中GetLastError和FormatMessage的正确用法是什么?

    我在 Delphi 2006 也是 Delphi 7 中使用第三方组件时遇到问题 在执行对该组件的函数调用时出现 未指定错误 您是否有在 Delphi 中使用 GetLastError 和 FormatMessage 的示例代码 这将允许我
  • ASP.Net MVC 4 的 WebAPI 未正确绑定复选框?

    我正在将 WebAPI 合并到我的开发中 并将所有表单提交发布到 WebAPI 控制器 我注意到复选框没有正确绑定到模型 我有一个表格使用 Html CheckBoxFor m gt m HasVideo 它生成一个复选框和一个隐藏的表单元
  • 反应式表单,检查用户名是否存在

    我在 Ionic Firebase 中遇到问题 验证器的值采用反应形式 特别是我有下面的这 2 个函数 用于检查 firebase 实时数据库中的用户名是否存在 这两个函数返回 Promise 布尔值 export class Userna
  • 以编程方式更改 IE 设置

    我正在尝试制作一个 Windows 应用程序 将 URL 添加到 IE 的 受信任站点 中 这部分有效 解决方案 http www nakov com blog 2009 05 15 c code for changing internet
  • PySimpleGUI 滑块有小数范围吗?

    我需要某种方法来在 PySimpleGUI 中的滑块上方显示十进制值 我已经尝试过输入十进制值 但是当我这样做时它会抛出错误 import PySimpleGUI as sg layout sg Slider range 850 999 d
  • 将 AjaxOnlyAttribute 和 ChildActionOnlyAttribute 组合到一个操作过滤器中

    我希望能够在控制器上标记一个动作 以便通过 ajax 调用和 RenderAction 来调用 问题在于这两个属性派生或实现不同的抽象 一种出路是下一个 AjaxOnly PartialViewResult GetViewAjax int