Skip to content

Commit 8569df8

Browse files
committed
fixes #986: pass Order value to selector model generated
1 parent ddc59f7 commit 8569df8

File tree

2 files changed

+72
-5
lines changed

2 files changed

+72
-5
lines changed

src/Microsoft.AspNetCore.OData/Routing/Conventions/AttributeRoutingConvention.cs

+4-3
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ private void ProcessAttributeModel(AttributeRouteModel attributeRouteModel, IEnu
142142
IServiceProvider sp = context.Options.RouteComponents[prefix].ServiceProvider;
143143

144144
SelectorModel newSelectorModel = CreateActionSelectorModel(prefix, model, sp, newRouteTemplate, actionSelector,
145-
attributeRouteModel.Template, actionModel.ActionName, controllerModel.ControllerName);
145+
attributeRouteModel.Template, actionModel.ActionName, controllerModel.ControllerName, attributeRouteModel.Order);
146146
if (newSelectorModel != null)
147147
{
148148
IList<SelectorModel> selectors;
@@ -158,7 +158,7 @@ private void ProcessAttributeModel(AttributeRouteModel attributeRouteModel, IEnu
158158

159159
private SelectorModel CreateActionSelectorModel(string prefix, IEdmModel model, IServiceProvider sp,
160160
string routeTemplate, SelectorModel actionSelectorModel,
161-
string originalTemplate, string actionName, string controllerName)
161+
string originalTemplate, string actionName, string controllerName, int? order)
162162
{
163163
try
164164
{
@@ -182,7 +182,8 @@ private SelectorModel CreateActionSelectorModel(string prefix, IEdmModel model,
182182
// replace the attribute routing template using absolute routing template to avoid appending any controller route template
183183
newSelectorModel.AttributeRouteModel = new AttributeRouteModel()
184184
{
185-
Template = $"/{originalTemplate}" // add a "/" to make sure it's absolute template, don't combine with controller
185+
Template = $"/{originalTemplate}", // add a "/" to make sure it's absolute template, don't combine with controller
186+
Order = order
186187
};
187188

188189
return newSelectorModel;

test/Microsoft.AspNetCore.OData.Tests/Routing/Conventions/AttributeRoutingConventionTests.cs

+68-2
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ public void AppliesToActionWithLongTemplateWorksAsExpected()
115115
// Assert
116116
SelectorModel actualSelectorModel = Assert.Single(action.Selectors);
117117
Assert.Equal("/Customers({key})/Orders({relatedKey})/NS.MyOrder/Title", actualSelectorModel.AttributeRouteModel.Template);
118+
Assert.Null(actualSelectorModel.AttributeRouteModel.Order);
118119
Assert.Contains(actualSelectorModel.EndpointMetadata, a => a is ODataRoutingMetadata);
119120
}
120121

@@ -144,21 +145,74 @@ public void AppliesToActionWithRoutePrefixWorksAsExpected()
144145
e =>
145146
{
146147
Assert.Equal("/Customers/{key}", e.AttributeRouteModel.Template);
148+
Assert.Equal(9, e.AttributeRouteModel.Order);
147149
Assert.Contains(e.EndpointMetadata, a => a is ODataRoutingMetadata);
148150
},
149151
e =>
150152
{
151153
Assert.Equal("/Orders/{key}", e.AttributeRouteModel.Template);
154+
Assert.Equal(9, e.AttributeRouteModel.Order);
152155
Assert.Contains(e.EndpointMetadata, a => a is ODataRoutingMetadata);
153156
},
154157
e =>
155158
{
156159
Assert.Equal("/Customers", e.AttributeRouteModel.Template);
160+
Assert.Equal(3, e.AttributeRouteModel.Order);
157161
Assert.Contains(e.EndpointMetadata, a => a is ODataRoutingMetadata);
158162
},
159163
e =>
160164
{
161165
Assert.Equal("/Orders", e.AttributeRouteModel.Template);
166+
Assert.Equal(3, e.AttributeRouteModel.Order);
167+
Assert.Contains(e.EndpointMetadata, a => a is ODataRoutingMetadata);
168+
});
169+
}
170+
171+
[Fact]
172+
public void AppliesToActionWithOrderOnControllerRoutePrefixWorksAsExpected()
173+
{
174+
// Arrange
175+
ControllerModel controller = ControllerModelHelpers.BuildControllerModel<WithPrefixController2>("List");
176+
ActionModel action = controller.Actions.First();
177+
Assert.Equal(2, action.Selectors.Count);
178+
179+
ODataControllerActionContext context = new ODataControllerActionContext(string.Empty, _edmModel, controller)
180+
{
181+
Action = action,
182+
Options = _options,
183+
};
184+
185+
AttributeRoutingConvention attributeConvention = CreateConvention();
186+
187+
// Act
188+
bool ok = _attributeConvention.AppliesToAction(context);
189+
Assert.False(ok);
190+
191+
// Assert
192+
Assert.Equal(4, action.Selectors.Count);
193+
Assert.Collection(action.Selectors,
194+
e =>
195+
{
196+
Assert.Equal("/Customers/{key}", e.AttributeRouteModel.Template);
197+
Assert.Equal(9, e.AttributeRouteModel.Order); // Order from controller
198+
Assert.Contains(e.EndpointMetadata, a => a is ODataRoutingMetadata);
199+
},
200+
e =>
201+
{
202+
Assert.Equal("/Orders/{key}", e.AttributeRouteModel.Template);
203+
Assert.Equal(8, e.AttributeRouteModel.Order); // Order from controller
204+
Assert.Contains(e.EndpointMetadata, a => a is ODataRoutingMetadata);
205+
},
206+
e =>
207+
{
208+
Assert.Equal("/Customers", e.AttributeRouteModel.Template);
209+
Assert.Equal(3, e.AttributeRouteModel.Order); // Order from action
210+
Assert.Contains(e.EndpointMetadata, a => a is ODataRoutingMetadata);
211+
},
212+
e =>
213+
{
214+
Assert.Equal("/Orders", e.AttributeRouteModel.Template);
215+
Assert.Equal(3, e.AttributeRouteModel.Order); // Order from action
162216
Assert.Contains(e.EndpointMetadata, a => a is ODataRoutingMetadata);
163217
});
164218
}
@@ -284,13 +338,25 @@ public void LongAction()
284338
[Route("Orders")]
285339
private class WithPrefixController
286340
{
287-
[HttpGet("{key}")]
288-
[HttpPost("")]
341+
[HttpGet("{key}", Order = 9)]
342+
[HttpPost("", Order = 3)]
289343
public void List(int key)
290344
{
291345
}
292346
}
293347

348+
[ODataAttributeRouting] // using this attribute if not derived from ODataController
349+
[Route("Customers", Order = 9)]
350+
[Route("Orders", Order = 8)]
351+
private class WithPrefixController2
352+
{
353+
[HttpGet("{key}")]
354+
[HttpPost("", Order = 3)] // 3 should override 8 on controller
355+
public void List()
356+
{
357+
}
358+
}
359+
294360
[Route("VipCustomer")]
295361
public class SingletonTestControllerWithPrefix
296362
{

0 commit comments

Comments
 (0)