2015-02-05 11 views
0

У меня возникли проблемы с созданием ссылок гиперссылки WebAPI в проекте, над которым я работаю.WebAPI Url.Link() return NULL

В фрагменте кода ниже методов расширения Order, OrderUpdate и OrderDelete для индивидуальных заказов все возвращаются. Нулевые ссылки. Я подозреваю, что это связано с тем, что WebAPI не может разрешить эти внутренние маршруты от родительского маршрута Orders.

Я не уверен, почему возвращаются нулевые ссылки, поскольку я предоставляю правильные имена маршрутов методу Link.

Вы можете увидеть из полученного вывода JSON, что Uri элементов являются всеми Null для элемента Links массива в пределах Order объекта.

// WebApiConfig.cs 

config.Routes.MapHttpRoute(
    name: "Orders", 
    routeTemplate: "api/orders", 
    defaults: new { controller = "order", action = "get" }, 
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) } 
); 


config.Routes.MapHttpRoute(
    name: "Order", 
    routeTemplate: "api/orders/{orderid}", 
    defaults: new { controller = "order" }, 
    constraints: new { orderid = "^[0-9]+$", httpMethod = new HttpMethodConstraint(HttpMethod.Get) } 
); 

config.Routes.MapHttpRoute(
    name: "OrderUpdate", 
    routeTemplate: "api/orders/{orderid}", 
    defaults: new { controller = "order", action = "put" }, 
    constraints: new { orderid = "^[0-9]+$", httpMethod = new HttpMethodConstraint(HttpMethod.Put) } 
); 

// OrderController.cs 

public async Task<Orders> Get() 
{ 
    var orders = new Orders(); 

    orders.Links.OrderList(Url, "self"); // returns a link OK 
    orders.Links.OrderAdd(Url, "order-create"); // returns a link OK 
    foreach (var order in await _repository.GetOrders()) 
    { 
     order.Links.Order(Url, "self", order.Id); // returns NULL 
     if (!User.IsInRole("Readonly")) 
     { 
      order.Links.OrderUpdate(Url, "order-update", order.Id); // returns NULL 
      order.Links.OrderDelete(Url, "order-delete", order.Id); // returns NULL 
     } 
     orders.Order.Add(order); 
    } 
    return orders; 
} 

// LinkGenerationExtensions.cs 

public static void Order(this List<Link> @this, UrlHelper url, string rel, int orderId) 
{ 
    @this.Add(new Link { Rel = rel, Uri = url.OrderUri(orderId) }); 
} 

public static string OrderUri(this UrlHelper url, int orderId) 
{ 
    return url.Link("Order", new { id = orderId }); 
} 

public static void OrderList(this List<Link> @this, UrlHelper url, string rel) 
{ 
    @this.Add(new Link { Rel = rel, Uri = url.OrderListUri() }); 
} 

public static string OrderListUri(this UrlHelper url) 
{ 
    return url.Link("Orders", new { }); 
} 

public static void OrderUpdate(this List<Link> @this, UrlHelper url, string rel, int orderId) 
{ 
    @this.Add(new Link { Rel = rel, Uri = url.OrderUpdateUri(orderId) }); 
} 

public static string OrderUpdateUri(this UrlHelper url, int orderId) 
{ 
    return url.Link("OrderUpdate", new { id = orderId }); 
} 

Приведенный выше код генерирует следующий JSON ответ:

{ 
    "Order": [ 
     { 
      "Id": 4, 
      "OrderRef": 123456, 
      "OrderDate": "2015-02-04T10:28:00", 
      "CustomerName": "ACME Construction Ltd", 
      "OrderedBy": "PA", 
      "InstallationDate": "2015-06-15T00:00:00", 
      "Address": "900 ACME Street", 
      "Postcode": "SW2 7AX", 
      "Town": "London", 
      "OrderNumber": "6508756191", 
      "Value": 525, 
      "Invoice": 0, 
      "Links": [ 
       { 
        "Rel": "self", 
        "Uri": null 
       }, 
       { 
        "Rel": "order-update", 
        "Uri": null 
       }, 
       { 
        "Rel": "order-delete", 
        "Uri": null 
       } 
      ] 
     } 
    ], 
    "Links": [ 
     { 
      "Rel": "self", 
      "Uri": "http://localhost/Site/api/orders" 
     }, 
     { 
      "Rel": "order-create", 
      "Uri": "http://localhost/Site/api/orders/add" 
     } 
    ] 
} 

ответ

2

Я ответил на свой вопрос после того, как обнаружил, что имена параметров в значениях маршрута должны соответствовать их определенным маршрутам.

Замена idorderid выполнила эту работу.

Вот обновленный код:

// LinkGenerationExtensions.cs 

public static void Order(this List<Link> @this, UrlHelper url, string rel, int orderId) 
{ 
    @this.Add(new Link { Rel = rel, Uri = url.OrderUri(orderId) }); 
} 

public static string OrderUri(this UrlHelper url, int orderId) 
{ 
    return url.Link("Order", new { orderid = orderId }); 
} 

public static void OrderList(this List<Link> @this, UrlHelper url, string rel) 
{ 
    @this.Add(new Link { Rel = rel, Uri = url.OrderListUri() }); 
} 

public static string OrderListUri(this UrlHelper url) 
{ 
    return url.Link("Orders", new { }); 
} 

public static void OrderUpdate(this List<Link> @this, UrlHelper url, string rel, int orderId) 
{ 
    @this.Add(new Link { Rel = rel, Uri = url.OrderUpdateUri(orderId) }); 
} 

public static string OrderUpdateUri(this UrlHelper url, int orderId) 
{ 
    return url.Link("OrderUpdate", new { orderid = orderId }); 
} 

public static void OrderDelete(this List<Link> @this, UrlHelper url, string rel, int orderId) 
{ 
    @this.Add(new Link { Rel = rel, Uri = url.OrderDeleteUri(orderId) }); 
} 

public static string OrderDeleteUri(this UrlHelper url, int orderId) 
{ 
    return url.Link("OrderDelete", new { orderid = orderId }); 
}