问题
So I have a custom Model Binder implemented for DateTime
type and I register it like below:
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
GlobalConfiguration.Configuration.BindParameter(typeof(DateTime), new CurrentCultureDateTimeAPI());
}
and then I have setup 2 sample actions to see if my custom model binding takes place:
[HttpGet]
public void BindDateTime([FromUri]DateTime datetime)
{
//http://localhost:26171/web/api/BindDateTime?datetime=09/12/2014
}
[HttpGet]
public void BindModel([FromUri]User user)
{
//http://localhost:26171/web/api/BindModel?Name=ibrahim&JoinDate=09/12/2014
}
When I run and invoke both actions from mentioned URLs, user
's JoinDate
property successfully gets bound using the custom binder I configured but BindDateTime
's datetime
parameter does not get bound using the custom binder.
I have already specified in config that all DateTime
should use my custom binder then why the indifference? Suggestions are highly appreciated.
CurrentCultureDateTimeAPI.cs:
public class CurrentCultureDateTimeAPI: IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
var date = value.ConvertTo(typeof(DateTime), CultureInfo.CurrentCulture);
bindingContext.Model = date;
return true;
}
}
NOTE: If I use [FromUri(Binder=typeof(CurrentCultureDateTimeAPI))]DateTime datetime
then it works as expected but then again why?
回答1:
Pretty surprising too :)
My initial doubt was this line:
GlobalConfiguration.Configuration.BindParameter(typeof(DateTime), new CurrentCultureDateTimeAPI());
MSDN says GlobalConfiguration
=> GlobalConfiguration provides a global System.Web.HTTP.HttpConfiguration for ASP.NET application
.
But for weird reasons this does not seem to work with this particular scenario.
So,
Just add this line inside the static class WebApiConfig
config.BindParameter(typeof(DateTime), new CurrentCultureDateTimeAPI());
so that your WebAPIConfig
file looks like:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "web/{controller}/{action}/{datetime}",
defaults: new { controller = "API", datetime = RouteParameter.Optional }
);
config.BindParameter(typeof(DateTime), new CurrentCultureDateTimeAPI());
}
And everything works fine because this method is directly invoked by WebAPI framework
so for sure your CurrentCultureDateTimeAPI
gets registered.
Checked this with your solution and works great.
Note: (From the comments) You can still support Attribute Routing
and you need not comment out this line config.MapHttpAttributeRoutes()
.
But still, It would be great if somebody can tell why GlobalConfiguration
does not work out
回答2:
It looks like you want to post some data to the server. Try to use FromData and post JSON. FromUri is typically used to fetch some data. Use WebAPI's conventions and allow it to work for you.
来源:https://stackoverflow.com/questions/24844830/web-api-modelbinding-from-uri