【问题标题】:How to Link to OData Collection in Razor using ASP.NET MVC Web API OData如何使用 ASP.NET MVC Web API OData 链接到 Razor 中的 OData 集合
【发布时间】:2013-03-07 11:35:35
【问题描述】:

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

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

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

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

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);
    }
}

【问题讨论】:

    标签: asp.net razor asp.net-web-api odata


    【解决方案1】:

    我们在System.Web.Http.UrlHelper 上有一个ODataLink 方法,但我们忘记向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 指令。

    【讨论】:

    • 另外,我打开了这个issue 来获得对这种方法的内置支持。
    • 谢谢,很高兴知道我没有疯。这也解决了更大的问题集。非常感谢您打开这个问题。
    • 此扩展是否适用于绑定的 odata 函数?我设想我需要执行以下操作,但我需要的构造函数是内部的:@Url.ODataUrl("odata", new EntitySetPathSegment("Entities"), new BoundFunctionPathSegment("SearchName", "curb"))跨度>
    猜你喜欢
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2013-01-12
    • 2016-03-17
    • 1970-01-01
    • 2015-02-14
    相关资源
    最近更新 更多