title: ASP.NET MVC: Html.Action / Html.ActionLink and culture specific DateTime
body: <p>I've been fighting with culture specific DateTime in ASP.NET MVC for few days now, to no avail.
  The scenario is as follows: I have a list which I want to filter against DateTime submitted by user. Users should handle dates in a localized form, in my case culture and cultureUI is set to "da-DK", so date format is "dd-mm-yy". So far I've managed to make the form submit date in the required format, but Action and ActionLink methods generate URLs that interpret dates in en-US ("mm/dd/yy").</p>
  
  <p>Here's a sample project displaying the issue. The culture in Web.config is hardcoded to "da-DK":</p>
  
  <pre><code>&lt;globalization culture="da-DK" uiCulture="da-DK" /&gt;
  </code></pre>
  
  <p>First the controller with two actions:</p>
  
  <pre><code>using System;
  using System.ComponentModel.DataAnnotations;
  using System.Web.Mvc;
  
  namespace DateTimeTest.Controllers
  {
      public class HomeController : Controller
      {
          public ViewResult Index(DateModel model)
          {
              return View(model);
          }
  
          public ViewResult Dummy(DateTime? date)
          {
              return View(date);
          }
      }
  
      public class DateModel
      {
          [DataType(DataType.Date)]
          public DateTime? Date { get; set; }
      }
  }
  </code></pre>
  
  <p>Index is an action displaying a form, where user can enter date in "dd-mm-yy" format. Form is posted to the same GET method (as I mentioned it's suppose to be filtering functionality), which will display the received date. Here's the Index.cshtml view:</p>
  
  <pre><code>@model DateTimeTest.Controllers.DateModel
  
  &lt;div&gt;
      @if (Model.Date != null)
      {
          &lt;p&gt;Received @Model.Date&lt;/p&gt;
          @Html.ActionLink("Dummy", "Dummy", new {Model.Date})
      }
  
      @using (Html.BeginForm("Index", "Home", FormMethod.Get))
      {
          @Html.EditorForModel()
      }
  &lt;/div&gt;
  </code></pre>
  
  <p>To make this work, I had to use a custom model binder, processing the DateTime. A simplified version looks as follows:</p>
  
  <pre><code>using System;
  using System.Web.Mvc;
  
  namespace DateTimeTest.Infrastructure
  {
      public class DateTimeBinder: IModelBinder
      {
          public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
          {
              string date = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue;
  
              DateTime? result = DateTime.Parse(date);
  
              return result;
          }
      }
  }
  </code></pre>
  
  <p>This binder has been registered in Global.asax.cs with</p>
  
  <pre><code>ModelBinders.Binders.Add(typeof(DateTime?), new DateTimeBinder());
  </code></pre>
  
  <p>Now, when in the form I enter date "30-12-2013" and submit, Index view displays message "Received 30-12-2013 00:00:00" which is correct in my meaning. However the link to Dummy action looks like this:</p>
  
  <pre><code>http://localhost:53143/Home/Dummy?Date=12%2F30%2F2013%2000%3A00%3A00
  </code></pre>
  
  <p>which means the query string for Date is actually "12/30/2013 00:00:00". Clicking the link gives a FormatException in BindModel of the DateTimeBinder, because there are no 30 months in the calendar (it tries to process the date in da-DK format while what it gets is date in en-US). I know how to deal with exception itself but what I don't know is how to either force the system to use uniform DateTime format, or detect in the binder which format it comes in and act accordingly. I guess it boils down to question how URLs are generated by Html.Action and Html.ActionLink methods, though I might be wrong.</p>
  
  <p>Note that I understand the need to treat GET URLs in en-US format (the post about fly tickets circulating around the web), though I would be willing to ignore this as the website I'm working on is an Intranet site where dates will only be used in da-DK format. Can anyone help me fix the issue? Thanks in advance.</p>
  
  <p>PS. I'm using ASP.NET MVC 5.</p>