Hi all,
You can't keep yourself away from writing blog when you have faced an issue while development and you tried to solve it and finally you come across something interesting which finally resolved the issue
Today's post is regarding the scenario which we face in day to day life (But i faced it for the first time today) where i had multilingual application running on telerik controls
One of the page had DateTimePicker,We have "da-DK" (Danish) clients,When tried to save Date from one page,The page kept on giving error message "DateTime format is not valid" for this field (Typical MVC datetime validation error messgae)
So scenario was in UI everything was coming as per culture,If i select date from DatePicker it was returning correct format,But still couldn't figure out what was wrong
So let me cut the story short and tell you,Model binder was the key to success
The code looks like following
You can't keep yourself away from writing blog when you have faced an issue while development and you tried to solve it and finally you come across something interesting which finally resolved the issue
Today's post is regarding the scenario which we face in day to day life (But i faced it for the first time today) where i had multilingual application running on telerik controls
One of the page had DateTimePicker,We have "da-DK" (Danish) clients,When tried to save Date from one page,The page kept on giving error message "DateTime format is not valid" for this field (Typical MVC datetime validation error messgae)
So scenario was in UI everything was coming as per culture,If i select date from DatePicker it was returning correct format,But still couldn't figure out what was wrong
So let me cut the story short and tell you,Model binder was the key to success
The code looks like following
public class DateTimeModelBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); ModelState modelState = new ModelState { Value = valueResult }; object actualValue = null; try { string culture = Convert.ToString(HttpContext.Current.Session["culture"]); Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture); Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture); actualValue = Convert.ToDateTime(valueResult.AttemptedValue, Thread.CurrentThread.CurrentCulture); } catch (FormatException e) { modelState.Errors.Add(e); } bindingContext.ModelState.Add(bindingContext.ModelName, modelState); return actualValue; } }
Above is simple class created under folder "Helper",Now what it does is it tells compiler that which format the date should be parsed so that its valid on server
Now,We are not done yet,We need to register this binders in global.asax file on Application_Start so that at runtime this class gets called and later on can parse the date as per culture,Which is like below
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); ModelBinders.Binders.Add(typeof(DateTime), new DateTimeModelBinder()); WebAssetDefaultSettings.UseTelerikContentDeliveryNetwork = true; }
Now,Try to submit the date which previously you were trying to in different culture and all will work,Same applies for currency,You can use Convert.Deciaml() instead of Convert.DateTime
Cheers!!!
Dear Daivagna,
ReplyDeleteAs far as DateTime issue is concerned can be also resolved by a usage of property which has been instantiated within CultureInfo class. Though above one is quite useful too.
Good One bro :)
Regards,
...Sapan
Thanks
ReplyDeleteCan you provide small sample? As app is already dealing with culture and in mvc when you use helper classes those properties automatically coverts itself to datetime picker and that also culture wise