public void CanBindCompleteTestObject() { var data = new Dictionary <string, string>() { { "intvalue", "1" }, { "stringvalue", "bar" }, { "datetimevalue", "2014-01-01" } }; var route = new RouteInvocation(null, null, data); var request = new Mock <IRequest>(); request.SetupGet(x => x.Query).Returns(new Dictionary <string, string[]>()); var method = this.GetType().GetMethod("testBindingMethod", BindingFlags.NonPublic | BindingFlags.Instance); var result = binder.GetArguments(route, request.Object, method); var obj = result.Single() as TestObject; Assert.IsNotNull(obj); Assert.AreEqual(1, obj.IntValue); Assert.AreEqual("bar", obj.StringValue); Assert.AreEqual(new DateTime(2014, 1, 1), obj.DateTimeValue); }
private ActionInvocation GetAction(IRequest request, RouteInvocation route) { var action = _createAction(); action.HandlerType = route.Target.HandlerType; var method = action.HandlerType.GetMethod(request.Method, BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.DeclaredOnly); if (method == null) { if (request.Method.Equals("head", StringComparison.OrdinalIgnoreCase)) { method = action.HandlerType.GetMethod("get", BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.DeclaredOnly); if (method == null) { return(action); } } else { return(action); } } action.Method = method; action.Arguments = route.Feature.ModelBinder.GetArguments(route, request, method); return(action); }
public void CanBindRouteDataWithHttpPost() { var data = new Dictionary <string, string>() { { "one", "foo" }, { "two", "bar" } }; var postData = new Dictionary <string, string[]> { { "two", new string[] { "glarch" } }, { "three", new string[] { "wibble" } } }; var route = new RouteInvocation(null, null, data); var request = new Mock <IRequest>(); request.SetupGet(x => x.Form).Returns(postData); var method = this.GetType().GetMethod("methodWithOptionalParameters", BindingFlags.NonPublic | BindingFlags.Instance); var result = binder.GetArguments(route, request.Object, method); CollectionAssert.AreEqual(new object[] { "foo", "glarch", "wibble" }, result); }
public void CanBindRouteDataWithArrayConversions() { var data = new Dictionary <string, string[]> { { "one", new string[] { "1", "2", "3" } } }; var route = new RouteInvocation(null, null, new Dictionary <string, string>()); var request = new Mock <IRequest>(); request.SetupGet(x => x.Query).Returns(data); var method = this.GetType().GetMethod("methodWithArrayParameters", BindingFlags.NonPublic | BindingFlags.Instance); var result = binder.GetArguments(route, request.Object, method); var arr1 = result[0] as int[]; CollectionAssert.AreEqual(new int[] { 1, 2, 3 }, arr1); }
public void CanBindRouteDataWithConversions() { var data = new Dictionary <string, string>() { { "one", "1" }, { "two", "true" }, { "three", "deadbeef-face-baba-da1e-cafec0deface" } }; var route = new RouteInvocation(null, null, data); var request = new Mock <IRequest>(); var method = this.GetType().GetMethod("methodWithTypedParameters", BindingFlags.NonPublic | BindingFlags.Instance); var result = binder.GetArguments(route, request.Object, method); CollectionAssert.AreEqual(new object[] { 1, true, new Guid("deadbeef-face-baba-da1e-cafec0deface") }, result); }
public object[] GetArguments(RouteInvocation route, IRequest request, MethodInfo method) { var foundArgs = new Dictionary <string, string[]>(ParameterComparer); foundArgs.Concat(route.RouteData); foundArgs.Concat(request.Query); foundArgs.Concat(request.Form); var args = new List <object>(); foreach (var parameter in method.GetParameters()) { object arg = null; var converter = Converters.FirstOrDefault (x => x.CanConvert(parameter.ParameterType)); if (converter != null) { arg = converter.Convert(parameter.ParameterType, parameter.Name, foundArgs); } if ((converter == null || arg == null) && parameter.IsOptional) { arg = (parameter.HasDefaultValue ? parameter.DefaultValue : null); } if (arg != null) { args.Add(arg); } else { throw new InvalidOperationException(String.Format( "Required argument {0} was not supplied to method {1} on handler {2}", parameter.Name, method.Name, method.DeclaringType)); } } return(args.ToArray()); }