本文整理汇总了C#中ILookup.FindMatchingAction方法的典型用法代码示例。如果您正苦于以下问题:C# ILookup.FindMatchingAction方法的具体用法?C# ILookup.FindMatchingAction怎么用?C# ILookup.FindMatchingAction使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ILookup
的用法示例。
在下文中一共展示了ILookup.FindMatchingAction方法的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: SelectAction
/// <inheritdoc/>
public override string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap)
{
if (odataPath == null)
{
throw Error.ArgumentNull("odataPath");
}
if (controllerContext == null)
{
throw Error.ArgumentNull("controllerContext");
}
if (actionMap == null)
{
throw Error.ArgumentNull("actionMap");
}
string prefix;
ComplexCastPathSegment cast;
IEdmProperty property = GetProperty(odataPath, controllerContext.Request.Method, out prefix, out cast);
IEdmEntityType declaringType = property == null ? null : property.DeclaringType as IEdmEntityType;
if (declaringType != null)
{
string actionName;
if (cast == null)
{
actionName = actionMap.FindMatchingAction(
prefix + property.Name + "From" + declaringType.Name,
prefix + property.Name);
}
else
{
// for example: GetCityOfSubAddressFromVipCustomer or GetCityOfSubAddress
actionName = actionMap.FindMatchingAction(
prefix + property.Name + "Of" + cast.CastType.Name + "From" + declaringType.Name,
prefix + property.Name + "Of" + cast.CastType.Name);
}
if (actionName != null)
{
if (odataPath.PathTemplate.StartsWith("~/entityset/key", StringComparison.Ordinal))
{
EntitySetPathSegment entitySetPathSegment = (EntitySetPathSegment)odataPath.Segments.First();
IEdmEntityType edmEntityType = entitySetPathSegment.EntitySetBase.EntityType();
KeyValuePathSegment keyValueSegment = (KeyValuePathSegment)odataPath.Segments[1];
controllerContext.AddKeyValueToRouteData(keyValueSegment, edmEntityType, ODataRouteConstants.Key);
}
return actionName;
}
}
return null;
}
示例2: SelectAction
public override string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap)
{
if (odataPath == null)
{
throw new ArgumentNullException("odataPath");
}
if (controllerContext == null)
{
throw new ArgumentNullException("controllerContext");
}
if (actionMap == null)
{
throw new ArgumentNullException("actionMap");
}
IEdmNavigationProperty navigationProperty = GetNavigationProperty(odataPath);
IEdmEntityType declaringType = navigationProperty == null ? null : navigationProperty.DeclaringType as IEdmEntityType;
if (declaringType != null)
{
HttpMethod httpMethod = controllerContext.Request.Method;
string actionName = null;
if (IsNavigationPropertyValuePath(odataPath))
{
if (httpMethod == HttpMethod.Get)
{
actionName = actionMap.FindMatchingAction("Get" + navigationProperty.Name, GetNavigationPropertyMethodName);
}
else if (httpMethod == HttpMethod.Post)
{
actionName = actionMap.FindMatchingAction("Post" + navigationProperty.Name, PostNavigationPropertyMethodName);
}
}
// Navigation property links are already handled by LinksRoutingConvention
// else if (IsNavigationPropertyLinkPath(odataPath)) {}
if (actionName != null)
{
KeyValuePathSegment keyValueSegment = odataPath.Segments[1] as KeyValuePathSegment;
if (keyValueSegment != null)
{
controllerContext.RouteData.Values[ODataRouteConstants.Key] = keyValueSegment.Value;
}
controllerContext.RouteData.Values[ODataRouteConstants.NavigationProperty] = navigationProperty.Name;
return actionName;
}
}
return null;
}
示例3: SelectAction
/// <inheritdoc/>
public override string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext,
ILookup<string, HttpActionDescriptor> actionMap)
{
if (odataPath == null)
{
throw Error.ArgumentNull("odataPath");
}
if (controllerContext == null)
{
throw Error.ArgumentNull("controllerContext");
}
if (actionMap == null)
{
throw Error.ArgumentNull("actionMap");
}
if (odataPath.PathTemplate == "~/singleton")
{
SingletonPathSegment singletonSegment = (SingletonPathSegment)odataPath.Segments[0];
string httpMethodName = GetActionNamePrefix(controllerContext.Request.Method);
if (httpMethodName != null)
{
// e.g. Try Get{SingletonName} first, then fallback on Get action name
return actionMap.FindMatchingAction(
httpMethodName + singletonSegment.Singleton.Name,
httpMethodName);
}
}
else if (odataPath.PathTemplate == "~/singleton/cast")
{
SingletonPathSegment singletonSegment = (SingletonPathSegment)odataPath.Segments[0];
IEdmEntityType entityType = (IEdmEntityType)odataPath.EdmType;
string httpMethodName = GetActionNamePrefix(controllerContext.Request.Method);
if (httpMethodName != null)
{
// e.g. Try Get{SingletonName}From{EntityTypeName} first, then fallback on Get action name
return actionMap.FindMatchingAction(
httpMethodName + singletonSegment.Singleton.Name + "From" + entityType.Name,
httpMethodName + "From" + entityType.Name);
}
}
return null;
}
示例4: SelectAction
/// <summary>
/// Selects the action for OData requests.
/// </summary>
/// <param name="odataPath">The OData path.</param>
/// <param name="controllerContext">The controller context.</param>
/// <param name="actionMap">The action map.</param>
/// <returns>
/// <c>null</c> if the request isn't handled by this convention; otherwise, the name of the selected action
/// </returns>
public override string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap)
{
if (odataPath == null)
{
throw Error.ArgumentNull("odataPath");
}
if (controllerContext == null)
{
throw Error.ArgumentNull("controllerContext");
}
if (actionMap == null)
{
throw Error.ArgumentNull("actionMap");
}
if (odataPath.PathTemplate == "~/entityset/key" ||
odataPath.PathTemplate == "~/entityset/key/cast")
{
HttpMethod httpMethod = controllerContext.Request.Method;
string httpMethodName;
switch (httpMethod.ToString().ToUpperInvariant())
{
case "GET":
httpMethodName = "Get";
break;
case "PUT":
httpMethodName = "Put";
break;
case "PATCH":
case "MERGE":
httpMethodName = "Patch";
break;
case "DELETE":
httpMethodName = "Delete";
break;
default:
return null;
}
Contract.Assert(httpMethodName != null);
IEdmEntityType entityType = odataPath.EdmType as IEdmEntityType;
// e.g. Try GetCustomer first, then fallback on Get action name
string actionName = actionMap.FindMatchingAction(
httpMethodName + entityType.Name,
httpMethodName);
if (actionName != null)
{
KeyValuePathSegment keyValueSegment = odataPath.Segments[1] as KeyValuePathSegment;
controllerContext.RouteData.Values[ODataRouteConstants.Key] = keyValueSegment.Value;
return actionName;
}
}
return null;
}
示例5: SelectAction
/// <inheritdoc/>
public override string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap)
{
if (odataPath == null)
{
throw Error.ArgumentNull("odataPath");
}
if (controllerContext == null)
{
throw Error.ArgumentNull("controllerContext");
}
if (actionMap == null)
{
throw Error.ArgumentNull("actionMap");
}
HttpMethod method = controllerContext.Request.Method;
if ((method == HttpMethod.Get || method == HttpMethod.Post) && (
odataPath.PathTemplate == "~/entityset/key/navigation" ||
odataPath.PathTemplate == "~/entityset/key/cast/navigation" ||
odataPath.PathTemplate == "~/singleton/navigation" ||
odataPath.PathTemplate == "~/singleton/cast/navigation"))
{
NavigationPathSegment navigationSegment = odataPath.Segments.Last() as NavigationPathSegment;
IEdmNavigationProperty navigationProperty = navigationSegment.NavigationProperty;
IEdmEntityType declaringType = navigationProperty.DeclaringType as IEdmEntityType;
if (declaringType != null)
{
string actionNamePrefix = (method == HttpMethod.Get) ? "Get" : "PostTo";
// e.g. Try GetNavigationPropertyFromDeclaringType first, then fallback on GetNavigationProperty action name
string actionName = actionMap.FindMatchingAction(
actionNamePrefix + navigationProperty.Name + "From" + declaringType.Name,
actionNamePrefix + navigationProperty.Name);
if (actionName != null)
{
if (odataPath.PathTemplate.StartsWith("~/entityset/key", StringComparison.Ordinal))
{
KeyValuePathSegment keyValueSegment = odataPath.Segments[1] as KeyValuePathSegment;
controllerContext.RouteData.Values[ODataRouteConstants.Key] = keyValueSegment.Value;
}
return actionName;
}
}
}
return null;
}
示例6: SelectAction
public static string SelectAction(this IEdmOperationImport procedure, ILookup<string, HttpActionDescriptor> actionMap, bool isCollection)
{
Contract.Assert(actionMap != null);
if (procedure == null)
{
return null;
}
IEdmOperation operation = procedure.Operation;
if (operation == null)
{
return null;
}
// The binding parameter is the first parameter by convention
IEdmOperationParameter bindingParameter = operation.Parameters.FirstOrDefault();
if (operation.IsBound && bindingParameter != null)
{
IEdmEntityType entityType = null;
if (!isCollection)
{
entityType = bindingParameter.Type.Definition as IEdmEntityType;
}
else
{
IEdmCollectionType bindingParameterType = bindingParameter.Type.Definition as IEdmCollectionType;
if (bindingParameterType != null)
{
entityType = bindingParameterType.ElementType.Definition as IEdmEntityType;
}
}
if (entityType == null)
{
return null;
}
string targetActionName = isCollection
? procedure.Name + "OnCollectionOf" + entityType.Name
: procedure.Name + "On" + entityType.Name;
return actionMap.FindMatchingAction(targetActionName, procedure.Name);
}
return null;
}
示例7: SelectAction
/// <inheritdoc/>
public override string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap)
{
if (odataPath == null)
{
throw Error.ArgumentNull("odataPath");
}
if (controllerContext == null)
{
throw Error.ArgumentNull("controllerContext");
}
if (actionMap == null)
{
throw Error.ArgumentNull("actionMap");
}
IEdmProperty property = GetProperty(odataPath, controllerContext.Request.Method);
IEdmEntityType declaringType = property == null ? null : property.DeclaringType as IEdmEntityType;
if (declaringType != null)
{
// e.g. Try GetPropertyFromDeclaringType first, then fallback on GetProperty action name
string actionName = actionMap.FindMatchingAction(
"Get" + property.Name + "From" + declaringType.Name,
"Get" + property.Name);
if (actionName != null)
{
if (odataPath.PathTemplate.StartsWith("~/entityset/key", StringComparison.Ordinal))
{
KeyValuePathSegment keyValueSegment = odataPath.Segments[1] as KeyValuePathSegment;
controllerContext.RouteData.Values[ODataRouteConstants.Key] = keyValueSegment.Value;
}
return actionName;
}
}
return null;
}
示例8: SelectAction
/// <summary>
/// Selects the action for OData requests.
/// </summary>
/// <param name="odataPath">The OData path.</param>
/// <param name="controllerContext">The controller context.</param>
/// <param name="actionMap">The action map.</param>
/// <returns>
/// <c>null</c> if the request isn't handled by this convention; otherwise, the name of the selected action
/// </returns>
public virtual string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap)
{
if (odataPath == null)
{
throw Error.ArgumentNull("odataPath");
}
if (controllerContext == null)
{
throw Error.ArgumentNull("controllerContext");
}
if (actionMap == null)
{
throw Error.ArgumentNull("actionMap");
}
if (odataPath.PathTemplate == "~/entityset")
{
EntitySetPathSegment entitySetSegment = odataPath.Segments[0] as EntitySetPathSegment;
IEdmEntitySet entitySet = entitySetSegment.EntitySet;
HttpMethod httpMethod = controllerContext.Request.Method;
if (httpMethod == HttpMethod.Get)
{
// e.g. Try GetCustomers first, then fallback on Get action name
return actionMap.FindMatchingAction(
"Get" + entitySet.Name,
"Get");
}
else if (httpMethod == HttpMethod.Post)
{
// e.g. Try PostCustomer first, then fallback on Post action name
return actionMap.FindMatchingAction(
"Post" + entitySet.ElementType.Name,
"Post");
}
}
return null;
}
示例9: SelectAction
/// <summary>
/// Selects the action for OData requests.
/// </summary>
/// <param name="odataPath">The OData path.</param>
/// <param name="controllerContext">The controller context.</param>
/// <param name="actionMap">The action map.</param>
/// <returns>
/// <c>null</c> if the request isn't handled by this convention; otherwise, the name of the selected action
/// </returns>
public override string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap)
{
if (odataPath == null)
{
throw Error.ArgumentNull("odataPath");
}
if (controllerContext == null)
{
throw Error.ArgumentNull("controllerContext");
}
if (actionMap == null)
{
throw Error.ArgumentNull("actionMap");
}
if (odataPath.PathTemplate == "~/entityset")
{
EntitySetPathSegment entitySetSegment = (EntitySetPathSegment)odataPath.Segments[0];
IEdmEntitySetBase entitySet = entitySetSegment.EntitySetBase;
HttpMethod httpMethod = controllerContext.Request.Method;
if (httpMethod == HttpMethod.Get)
{
// e.g. Try GetCustomers first, then fall back to Get action name
return actionMap.FindMatchingAction(
"Get" + entitySet.Name,
"Get");
}
else if (httpMethod == HttpMethod.Post)
{
// e.g. Try PostCustomer first, then fall back to Post action name
return actionMap.FindMatchingAction(
"Post" + entitySet.EntityType().Name,
"Post");
}
}
else if (odataPath.PathTemplate == "~/entityset/$count" &&
controllerContext.Request.Method == HttpMethod.Get)
{
EntitySetPathSegment entitySetSegment = (EntitySetPathSegment)odataPath.Segments[0];
IEdmEntitySetBase entitySet = entitySetSegment.EntitySetBase;
// e.g. Try GetCustomers first, then fall back to Get action name
return actionMap.FindMatchingAction(
"Get" + entitySet.Name,
"Get");
}
else if (odataPath.PathTemplate == "~/entityset/cast")
{
EntitySetPathSegment entitySetSegment = (EntitySetPathSegment)odataPath.Segments[0];
IEdmEntitySetBase entitySet = entitySetSegment.EntitySetBase;
IEdmCollectionType collectionType = (IEdmCollectionType)odataPath.EdmType;
IEdmEntityType entityType = (IEdmEntityType)collectionType.ElementType.Definition;
HttpMethod httpMethod = controllerContext.Request.Method;
if (httpMethod == HttpMethod.Get)
{
// e.g. Try GetCustomersFromSpecialCustomer first, then fall back to GetFromSpecialCustomer
return actionMap.FindMatchingAction(
"Get" + entitySet.Name + "From" + entityType.Name,
"GetFrom" + entityType.Name);
}
else if (httpMethod == HttpMethod.Post)
{
// e.g. Try PostCustomerFromSpecialCustomer first, then fall back to PostFromSpecialCustomer
return actionMap.FindMatchingAction(
"Post" + entitySet.EntityType().Name + "From" + entityType.Name,
"PostFrom" + entityType.Name);
}
}
else if (odataPath.PathTemplate == "~/entityset/cast/$count" &&
controllerContext.Request.Method == HttpMethod.Get)
{
EntitySetPathSegment entitySetSegment = (EntitySetPathSegment)odataPath.Segments[0];
IEdmEntitySetBase entitySet = entitySetSegment.EntitySetBase;
IEdmCollectionType collectionType = (IEdmCollectionType)odataPath.Segments[1].GetEdmType(
entitySetSegment.GetEdmType(previousEdmType: null));
IEdmEntityType entityType = (IEdmEntityType)collectionType.ElementType.Definition;
// e.g. Try GetCustomersFromSpecialCustomer first, then fall back to GetFromSpecialCustomer
return actionMap.FindMatchingAction(
"Get" + entitySet.Name + "From" + entityType.Name,
"GetFrom" + entityType.Name);
}
return null;
}
示例10: FindRefActionName
private static string FindRefActionName(ILookup<string, HttpActionDescriptor> actionMap,
IEdmNavigationProperty navigationProperty, IEdmEntityType declaringType, HttpMethod method)
{
string actionNamePrefix;
if (method == HttpMethod.Delete)
{
actionNamePrefix = DeleteRefActionNamePrefix;
}
else if (method == HttpMethod.Get)
{
actionNamePrefix = GetRefActionNamePrefix;
}
else
{
actionNamePrefix = CreateRefActionNamePrefix;
}
// Examples: CreateRefToOrdersFromCustomer, CreateRefToOrders, CreateRef.
return actionMap.FindMatchingAction(
actionNamePrefix + "To" + navigationProperty.Name + "From" + declaringType.Name,
actionNamePrefix + "To" + navigationProperty.Name,
actionNamePrefix);
}
示例11: FindLinksActionName
private static string FindLinksActionName(ILookup<string, HttpActionDescriptor> actionMap,
IEdmNavigationProperty navigationProperty, IEdmEntityType declaringType, HttpMethod method)
{
string actionNamePrefix;
if (method == HttpMethod.Delete)
{
actionNamePrefix = DeleteLinkActionNamePrefix;
}
else
{
actionNamePrefix = CreateLinkActionNamePrefix;
}
return actionMap.FindMatchingAction(
actionNamePrefix + "To" + navigationProperty.Name + "From" + declaringType.Name,
actionNamePrefix + "To" + navigationProperty.Name,
actionNamePrefix);
}
示例12: SelectAction
/// <summary>
/// Selects the action for OData requests.
/// </summary>
/// <param name="odataPath">The OData path.</param>
/// <param name="controllerContext">The controller context.</param>
/// <param name="actionMap">The action map.</param>
/// <returns>
/// <c>null</c> if the request isn't handled by this convention; otherwise, the name of the selected action
/// </returns>
public override string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap)
{
if (odataPath == null)
{
throw Error.ArgumentNull("odataPath");
}
if (controllerContext == null)
{
throw Error.ArgumentNull("controllerContext");
}
if (actionMap == null)
{
throw Error.ArgumentNull("actionMap");
}
if (controllerContext.Request.Method == HttpMethod.Post)
{
if (odataPath.PathTemplate == "~/entityset/key/action" ||
odataPath.PathTemplate == "~/entityset/key/cast/action")
{
ActionPathSegment actionSegment = odataPath.Segments.Last() as ActionPathSegment;
IEdmFunctionImport action = actionSegment.Action;
// The binding parameter is the first parameter by convention
IEdmFunctionParameter bindingParameter = action.Parameters.FirstOrDefault();
if (action.IsBindable && bindingParameter != null)
{
IEdmEntityType bindingParameterType = bindingParameter.Type.Definition as IEdmEntityType;
if (bindingParameterType != null)
{
// e.g. Try ActionOnBindingParameterType first, then fallback on Action action name
string actionName = actionMap.FindMatchingAction(
action.Name + "On" + bindingParameterType.Name,
action.Name);
if (actionName != null)
{
KeyValuePathSegment keyValueSegment = odataPath.Segments[1] as KeyValuePathSegment;
controllerContext.RouteData.Values[ODataRouteConstants.Key] = keyValueSegment.Value;
return actionName;
}
}
}
}
else if (odataPath.PathTemplate == "~/entityset/action" ||
odataPath.PathTemplate == "~/entityset/cast/action")
{
ActionPathSegment actionSegment = odataPath.Segments.Last() as ActionPathSegment;
IEdmFunctionImport action = actionSegment.Action;
// The binding parameter is the first parameter by convention
IEdmFunctionParameter bindingParameter = action.Parameters.FirstOrDefault();
if (action.IsBindable && bindingParameter != null)
{
IEdmCollectionType bindingParameterType = bindingParameter.Type.Definition as IEdmCollectionType;
if (bindingParameterType != null)
{
// e.g. Try ActionOnBindingParameterType first, then fallback on Action action name
IEdmEntityType elementType = bindingParameterType.ElementType.Definition as IEdmEntityType;
return actionMap.FindMatchingAction(
action.Name + "OnCollectionOf" + elementType.Name,
action.Name);
}
}
}
}
return null;
}
示例13: SelectAction
public override string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext,
ILookup<string, HttpActionDescriptor> actionMap)
{
if (odataPath == null)
{
throw Error.ArgumentNull("odataPath");
}
if (controllerContext == null)
{
throw Error.ArgumentNull("controllerContext");
}
if (actionMap == null)
{
throw Error.ArgumentNull("actionMap");
}
string actionName = null;
DynamicPropertyPathSegment dynamicPropertSegment = null;
switch (odataPath.PathTemplate)
{
case "~/entityset/key/dynamicproperty":
case "~/entityset/key/cast/dynamicproperty":
case "~/singleton/dynamicproperty":
case "~/singleton/cast/dynamicproperty":
dynamicPropertSegment = odataPath.Segments[odataPath.Segments.Count - 1] as DynamicPropertyPathSegment;
if (dynamicPropertSegment == null)
{
return null;
}
if (controllerContext.Request.Method == HttpMethod.Get)
{
string actionNamePrefix = String.Format(CultureInfo.InvariantCulture, "Get{0}", _actionName);
actionName = actionMap.FindMatchingAction(actionNamePrefix);
}
break;
case "~/entityset/key/property/dynamicproperty":
case "~/entityset/key/cast/property/dynamicproperty":
case "~/singleton/property/dynamicproperty":
case "~/singleton/cast/property/dynamicproperty":
dynamicPropertSegment = odataPath.Segments[odataPath.Segments.Count - 1] as DynamicPropertyPathSegment;
if (dynamicPropertSegment == null)
{
return null;
}
PropertyAccessPathSegment propertyAccessSegment = odataPath.Segments[odataPath.Segments.Count - 2]
as PropertyAccessPathSegment;
if (propertyAccessSegment == null)
{
return null;
}
EdmComplexType complexType = propertyAccessSegment.Property.Type.Definition as EdmComplexType;
if (complexType == null)
{
return null;
}
if (controllerContext.Request.Method == HttpMethod.Get)
{
string actionNamePrefix = String.Format(CultureInfo.InvariantCulture, "Get{0}", _actionName);
actionName = actionMap.FindMatchingAction(actionNamePrefix + "From" + propertyAccessSegment.Property.Name);
}
break;
default: break;
}
if (actionName != null)
{
if (odataPath.PathTemplate.StartsWith("~/entityset/key", StringComparison.Ordinal))
{
EntitySetPathSegment entitySetPathSegment = (EntitySetPathSegment)odataPath.Segments.First();
IEdmEntityType edmEntityType = entitySetPathSegment.EntitySetBase.EntityType();
KeyValuePathSegment keyValueSegment = (KeyValuePathSegment)odataPath.Segments[1];
controllerContext.AddKeyValueToRouteData(keyValueSegment, edmEntityType, ODataRouteConstants.Key);
}
controllerContext.RouteData.Values[ODataRouteConstants.DynamicProperty] = dynamicPropertSegment.PropertyName;
var key = ODataParameterValue.ParameterValuePrefix + ODataRouteConstants.DynamicProperty;
var value = new ODataParameterValue(dynamicPropertSegment.PropertyName, EdmLibHelpers.GetEdmPrimitiveTypeReferenceOrNull(typeof(string)));
controllerContext.Request.ODataProperties().RoutingConventionsStore[key] = value;
return actionName;
}
return null;
}
示例14: SelectAction
/// <inheritdoc/>
public override string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap)
{
if (odataPath == null)
{
throw Error.ArgumentNull("odataPath");
}
if (controllerContext == null)
{
throw Error.ArgumentNull("controllerContext");
}
if (actionMap == null)
{
throw Error.ArgumentNull("actionMap");
}
HttpMethod method = controllerContext.Request.Method;
string actionNamePrefix = GetActionMethodPrefix(method);
if (actionNamePrefix == null)
{
return null;
}
if (odataPath.PathTemplate == "~/entityset/key/navigation" ||
odataPath.PathTemplate == "~/entityset/key/cast/navigation" ||
odataPath.PathTemplate == "~/singleton/navigation" ||
odataPath.PathTemplate == "~/singleton/cast/navigation")
{
NavigationPathSegment navigationSegment = odataPath.Segments.Last() as NavigationPathSegment;
IEdmNavigationProperty navigationProperty = navigationSegment.NavigationProperty;
IEdmEntityType declaringType = navigationProperty.DeclaringType as IEdmEntityType;
// It is not valid to *Post* to any non-collection valued navigation property.
if (navigationProperty.TargetMultiplicity() != EdmMultiplicity.Many &&
method == HttpMethod.Post)
{
return null;
}
// It is not valid to *Put/Patch" to any collection-valued navigation property.
if (navigationProperty.TargetMultiplicity() == EdmMultiplicity.Many &&
(method == HttpMethod.Put || "PATCH" == method.Method.ToUpperInvariant()))
{
return null;
}
if (declaringType != null)
{
// e.g. Try GetNavigationPropertyFromDeclaringType first, then fallback on GetNavigationProperty action name
string actionName = actionMap.FindMatchingAction(
actionNamePrefix + navigationProperty.Name + "From" + declaringType.Name,
actionNamePrefix + navigationProperty.Name);
if (actionName != null)
{
if (odataPath.PathTemplate.StartsWith("~/entityset/key", StringComparison.Ordinal))
{
KeyValuePathSegment keyValueSegment = odataPath.Segments[1] as KeyValuePathSegment;
controllerContext.RouteData.Values[ODataRouteConstants.Key] = keyValueSegment.Value;
}
return actionName;
}
}
}
return null;
}