6

OData API を組み込んだ ASP.NET MVC 4 アプリがあります。これは、より大きな OData サポートで 2012.2 のものを実行しています。

私はこれに別の領域を使用しませんでした...それは間違いだったかもしれませんが、私のアプリは小さく、領域はやり過ぎのように見えました.

コントローラーを正しくセットアップしました。セグメント コレクション (セグメントはドメイン内のタイプです) へのパスの例は "/odata/Segments" です。これは期待どおりにロードされ、機能しています。

私のホームページで、Razor の Html.ActionLink (または RouteLink) を使用してこのリソースへのリンクを追加しようとしていますが、OData コントローラーのレイアウトはこれらのメソッドではうまく機能しないようです。 WebAPI構成:

config.Routes.MapODataRoute("OData Route", "odata", model );

次のようなものを使用して (私の知る限り) 絶対にないときに、odata コントローラーがあるふりをすることで、メソッドをだまして正しい URL を作成することができます。

@Html.RouteLink("Segments", "Segments", "odata")

しかし、それはハックのようです。

MapODataRoute に渡されたプレフィックスがどのように MVC チェーンに組み込まれているかを理解できるほど、ASP.NET ルーティングの配管をよく理解していないため、「正しい」かみそりメソッドを「正しい」方法で使用できます。

キックのために、これが私のSegmentsControllerです:

public class SegmentsController : EntitySetController<Segment, long>
{

    private MarketerDB db = new MarketerDB();

    // GET api/segments
    override public IQueryable<Segment> Get()
    {
        return db.Segments.AsQueryable();
    }


    protected override Segment GetEntityByKey(long key)
    {
        return db.Segments.Find(key);
    }


    public IQueryable<Affiliate> GetAffiliates([FromODataUri] long key)
    {
        return this.GetEntityByKey(key).Affiliates.AsQueryable();
    }

    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }
}
4

1 に答える 1

8

ODataLinkメソッドをオンにしていますSystem.Web.Http.UrlHelperが、MVC に追加するのを忘れていましたSystem.Web.Mvc.UrlHelper。追加するまでは、この拡張メソッドを使用できます。

namespace System.Web.Mvc
{
    public static class UrlHelperExtensions
    {
        private static IODataPathHandler _pathHandler = new DefaultODataPathHandler();

        public static string ODataUrl(this UrlHelper urlHelper, string routeName, params ODataPathSegment[] segments)
        {
            string odataPath = _pathHandler.Link(new ODataPath(segments));
            return urlHelper.HttpRouteUrl(
                routeName,
                new RouteValueDictionary() { { ODataRouteConstants.ODataPath, odataPath } });
        }
    }
}

次のようなことを行うことで、かみそりのビューからそれを呼び出します(エンティティセットの顧客があり、注文へのナビゲーションリンクを顧客に配置したいとします(42))、

@Url.ODataUrl("odata", new EntitySetPathSegment("customers"), new KeyValuePathSegment("42"), new NavigationPathSegment("orders"))

@using System.Web.Http.OData.Routingかみそりビューにディレクティブがあることを確認してください。

于 2013-03-19T02:25:03.300 に答える