Overriding default double error message with data annotations - asp.net-mvc

In my view model I have this very simple member,
[RegularExpression(#"^[0-9\.]*$",
ErrorMessage = "The only value you can enter here is a number")]
public double salary{ get; set; }
but when I put a value like 'abc' into the textbox, I receive this error message,
The value 'abc' is not valid for salary.
which is not the error message I've defined. Is there some sort of default behavior that you can't overwrite with annotations? Do I have to write a custom validator?

Before the field is validated against your regular expression, it is being validated to ensure that it is the correct type. Since 'abc' can't be converted to a double, you get that error message.
You could make salary a string and then parse it into a double in your controller, that will prevent the conversion and allow your Regex error message to be displayed when an invalid value is entered.
Otherwise, use Html.ValidationMessageFor to override the validation message
#Html.ValidationMessageFor(m => m.salary, "The only value you can enter here is a number")

RegularExpression should be used for string type, it will not be called for a double type since it is not possible to assign 'abc' to a double in the first place.

Related

How to handle non-required, non-nullable Datetime value upon Model validation

In my model I've got a non-nullable DateTime field. I haven't made it a required field. When I leave the corresponding input in the view empty and check for the modelstate I see that the validation fails on this field. It says "Value cannot be empty". Now, I understand that simple values can't be null so they have to be assigned some value. I also understand that making this field nullable will solve the problem. But how can I catch the case when the attempted value is empty for a certain field (just like default model binding does) to show my custom error message instead of the generic one?
public class Person
{
[DataType(DataType.DateTime)]
[Required(ErrorMessage = 'show my custom error message instead of the generic one')]
public DateTime StartDate{get;set;}
}
explicitly specify error messages as strings. Alternatively you can define them within resource files and optionally localize them depending on the language/culture of the incoming user.

MVC 5 - change Data anotation error message for Integers

In my Mvc5 test project I have a model with a property like the following:
[Required]
[DisplayName("Codigo Cliente")]
public int ClientCode{ get; set; }
the default error message when the user enteres a letter of special character in the editor is:
The field Codigo Cliente must be a number.
How can I modify this? in this case I need to change the language, but in case that I wanted to show a more specific error what can I do?
I have tried with the DataType attribute but the Enum does not have a value that applys for this case (numbers)
Use Range:
http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.rangeattribute.aspx
Or use IntegerOnly from Data Annotations Extensions
http://dataannotationsextensions.org/Integer/Create
The simplest way I found to solve this issue is use String with Range attribute in Data Annotation Model like specify below.
[Required]
[Range(0, int.MaxValue, ErrorMessage = "Codigo Cliente must be a positive or negative non-decimal number.")]
[DisplayName("Codigo Cliente")]
public string ClientCode { get; set; }
In Range attribute you can specify your custom Error Message.
For Interger use int.MaxValue , For double use double.MaxValue like so on.
I hope this will help you a lot.
If you want to specify a message you must use this
[Required(ErrorMessage = "your message")]
If you want to use a lang. based message is not that easy. You can use multiple resource file (for every language you need) and try a custom error binder that extends the DefaultModelBinder and make an override of the method BindModel(), there you can make your custom validation ad use your custom language message.

Customizing DefaultModelBinder validation messages

I am trying to replace the default validation messages in MVC3 that are displayed when you fail to fill in a required field or fill in an invalid value. I am only addressing server-side validation in this question. My custom message for invalid value is working, but the one for missing required field won't apply.
This is what I have done:
Added an ASP.NET folder called "App_GlobalResources" to the web project, and in that folder I placed a resources file called "DefaultMessages.resx", containing the following keys and values:
PropertyValueInvalid: The value you input is invalid
PropertyValueRequired: This field is required
(These are not the actual messages I will be using; they will be in a different language, which is my primary reason for needing to replace the default ones.)
Registered the resource file with the DefaultModelBinder in Global.asax.cs like this (note I am using Ninject for dependency injection):
public class MvcApplication : NinjectHttpApplication
{
...
protected override void OnApplicationStarted()
{
...
DefaultModelBinder.ResourceClassKey = "DefaultMessages";
...
}
...
}
In my model I have a DateTime property called ExpirationDate. Since DateTime is non-nullable, the property is implicitly required. PropertyValueInvalid works; my custom message is rendered in the form after I submit with an invalid value in the ExpirationDate field, such as 30.02.2014. But if I leave the field empty and submit, I only get the default "The ExpirationDate field is required".
What am I missing here? Is PropertyValueRequired not the right name? Or does it not apply to implicitly required properties? I also tried adding an explicit Required attribute in the Model, like this:
[Required]
public DateTime ExpirationDate{ get; set; }
But that makes no difference. What does work is adding a custom error message to the attribute, for example like this:
[Required(ErrorMessage = "We need a date here!")]
public DateTime ExpirationDate{ get; set; }
But I don't want to do that for all the required properties that typically just need a generic message. (I know I could reference the generic message in the resource file in the Required attribute instead of stating the message directly, but that still adds clutter to the Model that should not be necessary.)
For the date validation you need to handle the localization of : FieldMustBeDate actually what you are doing is correct but in order to handle all messages you need to have the following messages localized just in case:
FieldMustBeDate
FieldMustBeNumeric
PropertyValueInvalid
PropertyValueRequired

Setting MaxLength gives you error

Following is one of the property in my MVC model.
[Display(Name = "Event ID")]
[MaxLength(8, ErrorMessage = "Event ID can be of maximum 8 characters long")]
[Required(ErrorMessage="Event ID must be entered")]
public Nullable<int> ID_EVENTO { get; set; }
I have bound the model with a View, and when I try to click "Submit" button, it gives following runtime error -
Unable to cast object of type 'System.Int32' to type 'System.Array'
While, if I remove the "MaxLength" attribute, it starts working.
What could be the issue here?
MaxLength is used to specify the maximum length of array or string data allowed in a property.
Your ID_EVENTO is a nullable int (rather than array or string), that's why the attribute doesn't work. Sounds like you either want to remove the attribute or use a different one - Range or something?

asp.net mvc 3 validation on data type

I am trying to realize valition on data type. I have used DataAnnotations, but for data type it's not showing customized message
for example when I' am trying enter string data into int typed field. How I can customize messages in this case?
If I had to guess, you sound like you want a custom message to display when validating one or more fields in your model. You can subclass the DataAnnotations.ValidationAttribute class and override the IsValid(object) method and finally setting a custom ErrorMessage value (where ErrorMessage already belongs to the ValidationAttribute class)
public class SuperDuperValidator : ValidationAttribute
{
public override bool IsValid(object value)
{
bool valid = false;
// do your validation logic here
return valid;
}
}
Finally, decorate your model property with the attribute
public class MyClass
{
[SuperDuperValidator(ErrorMessage="Something is wrong with MyInt")]
public int MyInt { get; set; }
}
If you're using out-of-the-box MVC3, this should be all you need to propertly validate a model (though your model will probably differ/have more properties, etc) So, in your [HttpPost] controller action, MVC will automagically bind MyClass and you will be able to use ModelState.IsValid to determine whether or not the posted data is, in fact, valid.
Pavel,
The DataAnnotations DataType attribute does not affect validation. It's used to decide how your input is rendered. In such a case, David's solution above works.
However, if you want to use only the built-in validation attributes, you probably need to use the Range attribute like this:
[Range(0, 10, ErrorMessage="Please enter a number between 0 and 10")]
public int MyInt { get ; set ;}
(Of course, you should really be using the ErrorMessageResourceName/Type parameters and extract out hard-coded error message strings into resx files.)
Make sure to let MVC know where to render your error message:
<%= Html.ValidationMessageFor(m => m.MyInt) %>
Or you can just use EditorForModel and it will set it up correctly.
I don't think this has been answered because I have the same issue.
If you have a Model with a property of type int and the user types in a string of "asd" then the MVC3 framework binding/validation steps in and results in your view displaying "The value 'asd' is not valid for <model property name or DisplayName here>".
To me the poster is asking can this message that the MVC3 framework is outputting be customized?
I'd like to know too. Whilst the message is not too bad if you label your field something that easily indicates an number is expected you might still want to include additional reasons so it says something like:
"The value 'asd' is not valid for <fieldname>; must be a positive whole number."
So that the user is not entering value after value and getting different error messages each time.

Resources