5

asp.net の短い Web Api + OData チュートリアルを実行しています: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/getting-started-with -odata-in-web-api/create-a-read-only-odata-endpoint .

サンプル プロジェクトをダウンロードしましたが、動作します。Productしかし、その後、彼らが例で使用しているモデルをいじり始めました。整数キーの代わりに文字列型のキーとして機能する新しいプロパティを追加しました。

新しい Product.cs:

public class Product
{
    public string stringKey { get; set; }
    public int ID { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public string Category { get; set; }
}

変更されたコントローラー:

public class ProductsController : EntitySetController<Product, string>
{
    static List<Product> products = new List<Product>()
    {
        new Product() { stringKey = "one", ID = 1, Name = "Hat", Price = 15, Category = "Apparel" },
        new Product() { stringKey = "two", ID = 2, Name = "Socks", Price = 5, Category = "Apparel" },
        new Product() { stringKey = "three", ID = 3, Name = "Scarf", Price = 12, Category = "Apparel" },
        new Product() { stringKey = "four", ID = 4, Name = "Yo-yo", Price = 4.95M, Category = "Toys" },
        new Product() { stringKey = "five", ID = 5, Name = "Puzzle", Price = 8, Category = "Toys" },
    };

    [Queryable]
    public override IQueryable<Product> Get()
    {
        return products.AsQueryable();
    }

    protected override Product GetEntityByKey(string key)
    {
        return products.FirstOrDefault(p => p.stringKey == key);
    }
}

問題は/odata/Products(one)、文字列「one」に移動すると、GetEntityByKey(string key)アクションのキー引数にバインドされないことです。ただし、参照するとodata/Products(1)、「1」がkey引数にバインドされます。

文字列を数値でバインドするだけでなく、テキスト値で文字列を正しくバインドするにはどうすればよいですか?

アップデート

WebApiConfig を含めるのを忘れていました:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
        modelBuilder.EntitySet<Product>("Products");

        Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel();
        config.Routes.MapODataRoute("ODataRoute", "odata", model);
    }
}
4

1 に答える 1

8

パス /odata/Products(0011-1100) は、文字列キーとして "0011" のみをバインドすることに気付きました。

いくつか試してみたところ、次のパスが期待どおりに機能することがわかりました。

/odata/Products('one')

括弧内の文字列全体を読み取るには、一重引用符が必要なようです。

于 2013-06-10T14:41:39.833 に答える