I have a property of type DateTime MyDate
in my ViewModel. I want to make sure that the user only enters the Date part in a text box in a specific format (dd.mm.yyyy) and tried the following attributes:
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode=true)]
[RegularExpression(@"^(([0-2]\d|[3][0-1])\.([0]\d|[1][0-2])\.[2][0]\d{2})$",
ErrorMessage="Failed...")]
public DateTime MyDate { get; set; }
The controller action signature for a HttpPost looks like this:
[HttpPost]
public ActionResult Edit(int id, MyViewModel viewModel)
{
// MyViewModel contains the MyDate property ...
// ...
if (ModelState.IsValid)
{
// ...
}
// ...
}
In the Razor view I tried the following two ways:
@Html.TextBoxFor(model => model.MyDate)
@Html.EditorFor(model => model.MyDate)
It doesn't work as I want. The result is:
MyDate
property is filled correctly with the entered date in viewModel
which is passed to the action. So it seems that model binding was working.DisplayFormat
attribute is only respected by EditorFor
but not by TextBoxFor
. TextBoxFor
displays "dd.mm.yyyy hh:mm:ss"Questions:
Can I apply a RegularExpressionAttribute
at all on a property which isn't a string
? If it is allowed how is the reg ex evaluated for a non-string property like DateTime
on server side? Is something like MyDate.ToString()
compared with the reg ex? (It would explain that the validation fails because ToString will return a string including time part which doesn't pass the regular expression.)
Is the DisplayFormat
attribute generally only respected by EditorFor
and never by TextBoxFor
?
How can I do a date validation right?
Don't use regular expressions to validate dates, they are simply ignored.
Differences in cultures might be the root of your problem. Client side validation uses the browser's culture in order to validate the date. So for example if it is configured to en-US
the expected format would be MM/dd/yyyy
. If your server is configured to use fr-FR
the expected format would be dd/MM/yyyy
.
You could use the <globalization>
element in web.config to set the server side culture. You could configure it in such a way that it uses the same culture as the client:
<globalization culture="auto" uiCulture="auto"/>
Hanselman has a nice blog post about globalization and localization in ASP.NET MVC.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With