我有一个 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);
}
}