Passing a DateTime parameter to an MVC Action
If you need to pass a date to an MVC action method you should include it in a form and pass back the entire form as a single class.
If for some reason this can't be done and you have a method with a signature similar to
public class MyController
{
public void MyAction(int id, DateTime date)
}
it can be called in a view using something similar to
@{
int id = 0;
DateTime date = DateTime.Today;
}
@Url.Action("MyAction", "MyController", new {id, date})
This will create a URL along the lines of
/MyController/MyAction?id=0&date=SomeSerializedEquivalentOfDate
The default MVC DateTime binding is NOT culture aware so depending on your current culture settings it may serialize the date as dd-MM-yyyy, MM-dd-yyyy or any other format.
When the ModelBinder attempts to deserialize this to a DateTime it knows nothing about the culture it was serialized under so someone who selects a date of January 4th may find that the server thinks they selected April 1st.
There are a number of possible solutions than could be implmented quicker than a custom DateTime binder;
- A Culture Invariant serialization of the DateTime
@Url.Action("MyAction", "MyController", new {id, date.ToString("o")}) // ISO date format
- Convert the DateTime to ticks and post that as a number
public class MyController
{
public void MyAction(int id, long ticks)
{
DateTime date = new DateTime(ticks);
}
}
@Url.Action("MyAction", "MyController", new {id, ticks = date.Ticks})