【问题标题】:Key template value 'GetItems(Id={id})' for key segment 'id' does not start with '{' or ends with '}'键段“id”的键模板值“GetItems(Id={id})”不以“{”开头或以“}”结尾
【发布时间】:2022-01-04 16:32:38
【问题描述】:

我正在尝试在我的项目中使用 OData。

我有这个类JournalCopy,它有ICollection<JournalItemCopy> Items 属性。我试图通过JournalCopy 得到这个Items,并且我想使用OData 来过滤和扩展结果。

这是我的行动:

[ODataRoutePrefix("JournalRepetitives")]
[Authorize(AuthenticationSchemes = TenantRequired.DefaultSchemeName)]
public class JournalRepetitivesController : ODataController
{
    private readonly ReadModelContext _readModelContext;

    public JournalRepetitivesController(ReadModelContext readModelContext)
    {
        _readModelContext = readModelContext;

    }
    private IQueryable<JournalCopy> JournalCopyQuery() => _readModelContext.Set<JournalCopy>();

    [EnableQuery]
    [HttpGet]
    [ODataRoute("GetItems(Id={id})")]
    public IQueryable<JournalItemCopy> GetItems([FromODataUri] string id)
    {
        return JournalCopyQuery().Where(e => e.Id == id)
            .SelectMany(e => e.Items);
    }
}

我有这个配置:

public static class ReadModelConfiguration
{
    public static ODataModelBuilder Configure()
    {
        var builder = new ODataConventionModelBuilder();

        builder.EntityType<JournalCopy>().HasKey(e => e.Id);
        builder.EntityType<JournalItemCopy>().Collection.Function("GetItems")
            .ReturnsCollectionFromEntitySet<JournalItemCopy>(nameof(JournalItemCopy))
            .Parameter<string>("Id").Required();
    }
}

所以当我使用 http://localhost:8000/v2/JournalRepetitives/GetItems(Id='76dee73f-8cd4-4311-9708-4701c3d2d017') 在邮递员中调用 Api 但我在控制器“JournalRepetitives”中的操作“GetItems”上得到路径模板“JournalRepetitives/GetItems(Id={id})”不是有效的 OData 路径模板。键段“id”的键模板值“GetItems(Id={id})”不以“{”开头或以“}”结尾。但我不知道它的问题。

有什么办法可以解决吗?

【问题讨论】:

    标签: c# asp.net asp.net-core asp.net-web-api odata


    【解决方案1】:

    我从未使用过 OData 路由,但基于the documentation 我认为可能是以下几点:

    1. 删除 URL 中的引号。您通常不会在 URL 中使用引号。
    http://localhost:8000/v2/JournalRepetitives/GetItems(Id=76dee73f-8cd4-4311-9708-4701c3d2d017)
    
    1. 您可能需要删除Id=。所以你的路线应该是:
    [ODataRoute("GetItems({id})")]
    

    您的网址如下所示:

    http://localhost:8000/v2/JournalRepetitives/GetItems(76dee73f-8cd4-4311-9708-4701c3d2d017)
    
    1. 我似乎记得 Postman 的一个问题,即使不需要,它也会对括号进行 URL 编码,因此请尝试在 Postman 中禁用 URL 编码。在 Postman 中,在 URL 下,点击设置,然后关闭“自动编码 URL”。

    【讨论】:

      猜你喜欢
      • 2016-01-07
      • 2011-07-12
      • 2011-10-26
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      • 2017-04-23
      • 2020-05-11
      相关资源
      最近更新 更多