Skip to content

Commit 0b3a6c8

Browse files
author
Chris Martinez
committed
Update route parameters and fix action selection. Fixes #336. Resolves #337. Resolves #341.
1 parent 0430913 commit 0b3a6c8

File tree

3 files changed

+22
-24
lines changed

3 files changed

+22
-24
lines changed

src/Microsoft.AspNet.OData.Versioning/Routing/VersionedAttributeRoutingConvention.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
/// </content>
2020
public partial class VersionedAttributeRoutingConvention : IODataRoutingConvention
2121
{
22+
const string AttributeRouteData = nameof( AttributeRouteData );
2223
static readonly DefaultODataPathHandler defaultPathHandler = new DefaultODataPathHandler();
2324

2425
/// <summary>
@@ -161,8 +162,8 @@ public virtual string SelectController( ODataPath odataPath, HttpRequestMessage
161162

162163
if ( action.SupportedHttpMethods.Contains( request.Method ) && template.TryMatch( odataPath, values ) )
163164
{
164-
values["action"] = action.ActionName;
165-
request.Properties["AttributeRouteData"] = values;
165+
values[ODataRouteConstants.Action] = action.ActionName;
166+
request.Properties[AttributeRouteData] = values;
166167

167168
return action.ControllerDescriptor.ControllerName;
168169
}
@@ -183,7 +184,7 @@ public virtual string SelectAction( ODataPath odataPath, HttpControllerContext c
183184
var request = controllerContext.Request;
184185
var properties = request.Properties;
185186

186-
if ( !properties.TryGetValue( (string) "AttributeRouteData", out var value ) || !( value is IDictionary<string, object> attributeRouteData ) )
187+
if ( !properties.TryGetValue( AttributeRouteData, out var value ) || !( value is IDictionary<string, object> attributeRouteData ) )
187188
{
188189
return null;
189190
}
@@ -203,7 +204,7 @@ public virtual string SelectAction( ODataPath odataPath, HttpControllerContext c
203204
}
204205
}
205206

206-
return attributeRouteData["action"]?.ToString();
207+
return attributeRouteData[ODataRouteConstants.Action]?.ToString();
207208
}
208209

209210
IDictionary<ODataPathTemplate, HttpActionDescriptor> BuildAttributeMappings( IEnumerable<HttpControllerDescriptor> controllers )

src/Microsoft.AspNetCore.OData.Versioning/AspNet.OData/Routing/VersionedAttributeRoutingConvention.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@ protected virtual IEnumerable<SelectControllerResult> SelectController( RouteCon
148148
}
149149
}
150150

151+
items[ODataRouteConstants.Action] = action.ActionName;
152+
151153
yield return new SelectControllerResult( action.ControllerName, items );
152154
}
153155
}
@@ -161,18 +163,20 @@ public IEnumerable<ControllerActionDescriptor> SelectAction( RouteContext routeC
161163
{
162164
Arg.NotNull( routeContext, nameof( routeContext ) );
163165

164-
var services = routeContext.HttpContext.RequestServices;
166+
var httpContext = routeContext.HttpContext;
167+
var services = httpContext.RequestServices;
165168
var actionCollectionProvider = services.GetRequiredService<IActionDescriptorCollectionProvider>();
166169
var actionDescriptors = actionCollectionProvider.ActionDescriptors.Items.OfType<ControllerActionDescriptor>().ToArray();
170+
var comparer = StringComparer.OrdinalIgnoreCase;
167171

168172
foreach ( var controllerResult in SelectController( routeContext ) )
169173
{
170174
var controllerName = controllerResult.ControllerName;
171-
var attributeRouteData = controllerResult.Values;
175+
var actionName = controllerResult.Values[ODataRouteConstants.Action].ToString();
172176

173177
foreach ( var action in actionDescriptors )
174178
{
175-
if ( action.ControllerName == controllerName )
179+
if ( action.ControllerName == controllerName && comparer.Equals( actionName, action.ActionName ) )
176180
{
177181
yield return action;
178182
}

src/Microsoft.AspNetCore.OData.Versioning/AspNetCore.Mvc/Versioning/ODataApiVersionActionSelector.cs

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
[CLSCompliant( false )]
2626
public class ODataApiVersionActionSelector : ApiVersionActionSelector
2727
{
28-
static readonly string ActionKey = ODataRouteConstants.Action;
29-
3028
/// <summary>
3129
/// Initializes a new instance of the <see cref="ODataApiVersionActionSelector"/> class.
3230
/// </summary>
@@ -53,7 +51,7 @@ public override IReadOnlyList<ActionDescriptor> SelectCandidates( RouteContext c
5351

5452
var odataPath = context.HttpContext.ODataFeature().Path;
5553
var routeValues = context.RouteData.Values;
56-
var notODataCandidate = odataPath == null || routeValues.ContainsKey( ActionKey );
54+
var notODataCandidate = odataPath == null || routeValues.ContainsKey( ODataRouteConstants.Action );
5755

5856
if ( notODataCandidate )
5957
{
@@ -75,14 +73,16 @@ public override IReadOnlyList<ActionDescriptor> SelectCandidates( RouteContext c
7573
{
7674
var actions = convention.SelectAction( context );
7775

78-
if ( actions != null )
76+
if ( actions == null )
77+
{
78+
continue;
79+
}
80+
81+
foreach ( var action in actions )
7982
{
80-
foreach ( var action in actions )
83+
if ( visited.Add( action ) )
8184
{
82-
if ( visited.Add( action ) )
83-
{
84-
possibleCandidates.Add( new ActionCandidate( action ) );
85-
}
85+
possibleCandidates.Add( new ActionCandidate( action ) );
8686
}
8787
}
8888
}
@@ -162,14 +162,7 @@ public override ActionDescriptor SelectBestCandidate( RouteContext context, IRea
162162

163163
selectionResult.AddMatches( finalMatches );
164164

165-
var bestCandidate = RoutePolicy.Evaluate( context, selectionResult );
166-
167-
if ( bestCandidate is ControllerActionDescriptor controllerAction )
168-
{
169-
context.RouteData.Values[ActionKey] = controllerAction.ActionName;
170-
}
171-
172-
return bestCandidate;
165+
return RoutePolicy.Evaluate( context, selectionResult );
173166
}
174167

175168
[DebuggerDisplay( "{Action.DisplayName,nq}" )]

0 commit comments

Comments
 (0)