Created
April 6, 2016 15:16
-
-
Save tugberkugurlu/4bcb7af3682771ba9c18828329f04920 to your computer and use it in GitHub Desktop.
Bind complex type objects from body by default on ASP.NET Core 1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Microsoft.AspNet.Mvc.ApplicationModels; | |
using Microsoft.AspNet.Mvc.ModelBinding; | |
using System; | |
namespace Foo.Web.Infrastructure.Conventions | |
{ | |
public class ComplexTypeConvention : IActionModelConvention | |
{ | |
public void Apply(ActionModel action) | |
{ | |
foreach (var parameter in action.Parameters) | |
{ | |
var paramType = parameter.ParameterInfo.ParameterType; | |
if (parameter.BindingInfo == null && (IsSimpleType(paramType) || IsSimpleUnderlyingType(paramType)) == false) | |
{ | |
parameter.BindingInfo = new BindingInfo | |
{ | |
BindingSource = BindingSource.Body | |
}; | |
} | |
} | |
} | |
private static bool IsSimpleType(Type type) | |
{ | |
return type.IsPrimitive || | |
type.Equals(typeof(string)) || | |
type.Equals(typeof(DateTime)) || | |
type.Equals(typeof(Decimal)) || | |
type.Equals(typeof(Guid)) || | |
type.Equals(typeof(DateTimeOffset)) || | |
type.Equals(typeof(TimeSpan)); | |
} | |
private static bool IsSimpleUnderlyingType(Type type) | |
{ | |
Type underlyingType = Nullable.GetUnderlyingType(type); | |
if (underlyingType != null) | |
{ | |
type = underlyingType; | |
} | |
return IsSimpleType(type); | |
} | |
} | |
} |
@tugberkugurlu Hi, can you provide a snippet how to actually use this convention? Where and how should I bind it?
@vebbo2 Add the following line in startup.cs
services.AddMvc(options =>
{
options.Conventions.Add(new ComplexTypeConvention());
});
I had a similar convention, that worked for a while. But now it's not working and it's not hitting any breakpoints and I only get null values on complex type parameters. Any ideas?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Using RC1 with a dnxcore50 target, IsPrimitive is not available off of Type.