使用场景说明

在某些情况下调用了框架默认生成的方法,并且页面提示【没有权限操作】,但又没有给用户分配权限,或者不想分配权限,可以直接重写框架方法的权限

使用说明、重写控制器方法、重写控制器方法权限

  1. 生成页面默认调用的接口需要完全自定义处理
  2. 页面打开提示【没有权限操作】:先检查菜单上的表名是否正确;如果当前页面调用的其他表查询方法,同时没有分配菜单权限就可以按下面对应的接口重写方法
  3. 浏览器打开按 F12,点开网络 → 刷新页面,可以看到请求的接口地址(表名)与控制器方法

使用示例

1. 在表的控制器上实现对应的方法来重写权限
2. 以 MES_Customer 表控制器为例,在控制器实现 GetPageData 查询方法并添加 [ApiActionPermission] 属性重写权限

public partial class MES_CustomerController
{
    private readonly IMES_CustomerService _service;
    private readonly IHttpContextAccessor _httpContextAccessor;

    [ActivatorUtilitiesConstructor]
    public MES_CustomerController(
        IMES_CustomerService service,
        IHttpContextAccessor httpContextAccessor
    ) : base(service)
    {
        _service = service;
        _httpContextAccessor = httpContextAccessor;
    }

    // 重写查询接口权限,将 GetPageData 方法复制到 [表Controller] 里即可实现权限重写
    [ApiActionPermission] // 移除权限验证,框架只会验证是否登录
    //[AllowAnonymous] // 同时加上 AllowAnonymous 属性,未登录的也可以访问
    public override ActionResult GetPageData([FromBody] PageDataOptions loadData)
    {
        return base.GetPageData(loadData);
    }
}
[vue3代码]写在生成的[表.vue]文件中,[vue2代码]写在[表.jsx]文件methods方法中;二选一实现

主表查询/异步

主表查询
[ApiActionPermission] // 移除权限验证,框架只会验证是否登录
//[AllowAnonymous] // 同时加上 AllowAnonymous 属性,未登录的也可以访问
public override ActionResult GetPageData([FromBody] PageDataOptions loadData)
{
    return base.GetPageData(loadData);
}

明细查询/异步

明细查询
[ApiActionPermission] // 移除权限验证,框架只会验证是否登录
//[AllowAnonymous] // 同时加上 AllowAnonymous 属性,未登录的也可以访问
public override ActionResult GetDetailPage([FromBody] PageDataOptions loadData)
{
    return base.GetDetailPage(loadData);
}

新建/异步

新建
[ApiActionPermission] // 移除权限验证,框架只会验证是否登录
//[AllowAnonymous] // 同时加上 AllowAnonymous 属性,未登录的也可以访问
public override ActionResult Add([FromBody] SaveModel saveModel)
{
    return base.Add(saveModel);
}

编辑/异步

编辑
[ApiActionPermission] // 移除权限验证,框架只会验证是否登录
//[AllowAnonymous] // 同时加上 AllowAnonymous 属性,未登录的也可以访问
public override ActionResult Update([FromBody] SaveModel saveModel)
{
    return base.Update(saveModel);
}

文件上传/异步

文件上传
[ApiActionPermission] // 移除权限验证,框架只会验证是否登录
//[AllowAnonymous] // 同时加上 AllowAnonymous 属性,未登录的也可以访问
public override IActionResult Upload(IEnumerable<IFormFile> fileInput)
{
    return base.Upload(fileInput);
}

下载导入模板/异步

下载导入模板
[ApiActionPermission] // 移除权限验证,框架只会验证是否登录
//[AllowAnonymous] // 同时加上 AllowAnonymous 属性,未登录的也可以访问
public override ActionResult DownLoadTemplate()
{
    return base.DownLoadTemplate();
}

导入/异步

导入
[ApiActionPermission] // 移除权限验证,框架只会验证是否登录
//[AllowAnonymous] // 同时加上 AllowAnonymous 属性,未登录的也可以访问
public override ActionResult Import(List<IFormFile> fileInput)
{
    return base.Import(fileInput);
}

导出/异步

导出
[ApiActionPermission] // 移除权限验证,框架只会验证是否登录
//[AllowAnonymous] // 同时加上 AllowAnonymous 属性,未登录的也可以访问
public override ActionResult Export([FromBody] PageDataOptions loadData)
{
    return base.Export(loadData);
}

删除/异步

删除
[ApiActionPermission] // 移除权限验证,框架只会验证是否登录
//[AllowAnonymous] // 同时加上 AllowAnonymous 属性,未登录的也可以访问
public override ActionResult Del([FromBody] object[] keys)
{
    return base.Del(keys);
}

审核/异步

审核
[ApiActionPermission] // 移除权限验证,框架只会验证是否登录
//[AllowAnonymous] // 同时加上 AllowAnonymous 属性,未登录的也可以访问
public override ActionResult Audit([FromBody] object[] id, int? auditStatus, string auditReason)
{
    return base.Audit(id, auditStatus, auditReason);
}

使用示例(完整)

以下为 MES_CustomerController 示例:将基类 ApiBaseController 中可重写的 Action 全部列出,按需删除或保留;路由与基类保持一致。

public partial class MES_CustomerController
{
    private readonly IMES_CustomerService _service;
    private readonly IHttpContextAccessor _httpContextAccessor;

    [ActivatorUtilitiesConstructor]
    public MES_CustomerController(
        IMES_CustomerService service,
        IHttpContextAccessor httpContextAccessor
    ) : base(service)
    {
        _service = service;
        _httpContextAccessor = httpContextAccessor;
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("getPageData")]
    public override ActionResult GetPageData([FromBody] PageDataOptions loadData)
    {
        return base.GetPageData(loadData);
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("getPageDataAsync")]
    public override async Task<ActionResult> GetPageDataAsync([FromBody] PageDataOptions loadData)
    {
        return await base.GetPageDataAsync(loadData);
    }
    
    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("Add")]
    public override ActionResult Add([FromBody] SaveModel saveModel)
    {
        return base.Add(saveModel);
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("addAsync")]
    public override async Task<ActionResult> AddAsync([FromBody] SaveModel saveModel)
    {
        return await base.AddAsync(saveModel);
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("Update")]
    public override ActionResult Update([FromBody] SaveModel saveModel)
    {
        return base.Update(saveModel);
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("updateAsync")]
    public override async Task<ActionResult> UpdateAsync([FromBody] SaveModel saveModel)
    {
        return await base.UpdateAsync(saveModel);
    }
    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("GetDetailPage")]
    public override ActionResult GetDetailPage([FromBody] PageDataOptions loadData)
    {
        return base.GetDetailPage(loadData);
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("getDetailPageAsync")]
    public override async Task<ActionResult> GetDetailPageAsync([FromBody] PageDataOptions loadData)
    {
        return await base.GetDetailPageAsync(loadData);
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("Upload")]
    public override IActionResult Upload(IEnumerable<IFormFile> fileInput)
    {
        return base.Upload(fileInput);
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("uploadAsync")]
    public override async Task<IActionResult> UploadAsync(IEnumerable<IFormFile> fileInput)
    {
        return await base.UploadAsync(fileInput);
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpGet, Route("DownLoadTemplate")]
    public override ActionResult DownLoadTemplate()
    {
        return base.DownLoadTemplate();
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpGet, Route("downLoadTemplateAsync")]
    public override async Task<ActionResult> DownLoadTemplateAsync()
    {
        return await base.DownLoadTemplateAsync();
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("Import")]
    public override ActionResult Import(List<IFormFile> fileInput)
    {
        return base.Import(fileInput);
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("importAsync")]
    public override async Task<ActionResult> ImportAsync(List<IFormFile> fileInput)
    {
        return await base.ImportAsync(fileInput);
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("Export")]
    public override ActionResult Export([FromBody] PageDataOptions loadData)
    {
        return base.Export(loadData);
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("exportAsync")]
    public override async Task<ActionResult> ExportAsync([FromBody] PageDataOptions loadData)
    {
        return await base.ExportAsync(loadData);
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("Del")]
    public override ActionResult Del([FromBody] object[] keys)
    {
        return base.Del(keys);
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("delAsync")]
    public override async Task<ActionResult> DelAsync([FromBody] object[] keys)
    {
        return await base.DelAsync(keys);
    }

    [ApiActionPermission]
    //[AllowAnonymous]
    [HttpPost, Route("Audit")]
    public override ActionResult Audit([FromBody] object[] id, int? auditStatus, string auditReason)
    {
        return base.Audit(id, auditStatus, auditReason);
    }
}
Last Updated 2026/5/12 17:18:25