首页 > 解决方案 > 向 OData 控制器添加函数或参数

问题描述

我正在为 ASP.NET Core 使用 ASP.NET 样板框架。我有按照https://aspnetboilerplate.com/Pages/Documents/OData-AspNetCore-Integration的样板 OData 控制器。

我想支持在 GET 方法或自定义 OData 函数中传递自定义参数。我该如何做到这一点AbpODataEntityController

问候,大卫

标签: asp.net-corecontrolleroverridingodataaspnetboilerplate

解决方案


查看源代码,看起来他们正在使用标准的“Microsoft.AspNet.OData”Version="7.1.0"。

所以你可能有一个地方可以设置你的EdmModel. 您应该在控制器中创建一个函数,如下所示:

// odata/Tenants/Default.IsDomainAvailable('<domain name here>')
[HttpGet]
public IActionResult IsDomainAvailable([FromODataUri] string domainName)
{
    if (!ModelState.IsValid) return BadRequest();
    try
    {
        var item = _unitOfWork.Tenants
            .FindByHostName(domainName)
            .FirstOrDefault();

        if (item == null) 
            return Ok(string.Format("{0} is available", domainName));

        return StatusCode(StatusCodes.Status409Conflict, string.Format("{0} is not available", domainName));
    }
    catch (Exception ex)
    {
        return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
    }
}

然后你可以像这样在你的 EDM 模型构建器中声明一个函数:

private void BuildFunctions(ODataModelBuilder builder)
{
    builder.EntityType<TenantDTO>().Collection
        .Function("IsDomainAvailable")
        .Returns<IActionResult>()
        .Parameter<string>("domainName");
}

并像这样从 Postman 调用它:

odata/Tenants/Default.IsDomainAvailable('<domain name here>')

希望这可以帮助。


推荐阅读