6

我有一个 ASP.NET MVC 4 应用程序,我正在将 OData API 合并到其中。这是运行具有更大 OData 支持的 2012.2 的东西。

我没有为此使用单独的区域……这可能是一个错误,但我的应用程序很小,而且区域似乎过大了。

我的控制器设置正确,我的 Segments 集合的示例路径(segments 是我域中的一种类型)是“/odata/Segments”。这按预期加载并且正在工作。

在我的主页上,我正在尝试使用 Razor 的 Html.ActionLink(或 RouteLink)添加指向此资源的链接,但似乎 OData 控制器布局不适用于这些方法,因为控制器在注册时以“odata”为前缀WebAPI 配置:

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

当肯定没有(据我所知)这样的东西时,我可以通过假装有一个 odata 控制器来欺骗构造正确 url 的方法:

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

但这似乎是一个黑客行为。

我不太了解 ASP.NET 路由管道,无法理解传递给 MapODataRoute 的前缀是如何合并到 MVC 链中的,这样我就可以以“正确”的方式使用“正确的”剃须刀方法。

只是为了好玩,这是我的 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 回答