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
Related
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.
How to validate that user enters string in textbox in asp mvc4?
What to write in required tag?
[required]
Use the [RegularExpression] attribute if you want to limit the user to only typing in alphabetic characters.
More info on MSDN.
Here is a good link to a regular expression that you can use.
This example maybe helps:
public class CustomerMetaData
{
// Require that the Title is not null.
// Use custom validation error.
[Required(ErrorMessage = "Title is required.")]
public object Title;
// Require that the MiddleName is not null.
// Use standard validation error.
[Required()]
public object MiddleName;
}
There are many ways to do it
1) By using plain Javascript or JQuery to check if it has value before submiting the page
2) On controller method check if it has value
3) If you a using EF and your view binded to a model add attribute called [Required]to the property of that model.
What do you actually want to do?
Make sure that the object the server receives has correct data in it? Then you should use data attributes on your C# model. However what do you mean by "enters string"? If the user simply needs to enter any string, then [Required] works - this just means that there has to be some value entered. Do you only want to allow a specific set of characters, like the English alphabet? Then you need to use a RegularExpression attribute.
If you further specify what you actually want to do I am sure we can help you more.
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.
This is my Model class
public class Model
{
[DataType(DataType.DateTime, ErrorMessage = "My error message")]
public DateTime Day { get; set; }
}
When I try to input incorrect value for example "notdate" i got the error
"The value 'notdate' is not valid for Day." instead of my specified ErrorMessage "My error message".
I use ASP.NET MVC 3.0 beta. This is a bug?
There are a few things to note about the behavior you are describing.
First, you are receiving this error because an exception is being thrown when attempting to assign the string value 'notdate' to a DateTime field. When this happens, any validation messages that may have been associated with the field will be overwritten with the generic message: The value '{0}' is not valid for {1}.
Second,the base DataTypeAttribute doesn't actually perform any validation on the field. Using Reflector, you will see that the DataTypeAttribute.IsValid() method is declared as follows:
public override bool IsValid(object value)
{
return true;
}
Hope this helps.
No, this is the default functionality of the existing model binder.
The DataType has nothing to do with basic model binding and won't override basic model binding errors.
my object has field with data type int. when i put in html form in this textbox letter not number the validator say- The field must be a number. how can i change this messages like this
[Required(ErrorMessage = "Введите название")]
[DisplayName("Название")]
public int age { get; set; }
I haven't found a clean way to achieve this using Data Annotations. One way would be to write a custom model binder but this seems like a lot of work to do for such a simple task.
Another way to achieve this is to add an App_GlobalResources folder to your ASP.NET application. Add a resource file called Messages.resx containing a PropertyValueRequired string resource.
PropertyValueRequired = "Some custom error message"
In your Application_Start register the resource class key:
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
DefaultModelBinder.ResourceClassKey = "Messages";
}
Note that ASP.NET MVC 2 uses the PropertyValueInvalid instead of PropertyValueRequired resource key.
IMO using Data Annotations to perform validation logic is limited (maybe in .NET 4 this will change). If you want to have full control over the validation logic I would recommend you using a validation library such as Fluent Validation or xVal.
I ran into the same problem and worked around it by specifying a RegularExpression that only allows positive natural numbers.
[Required(ErrorMessage = "Введите название")]
[DisplayName("Название")]
[RegularExpression(#"^[0-9]+$", ErrorMessage = "Поле возраст не является числом")]
public int age { get; set; }
Not sure if there are any downfalls to this solution. It seems to work fine for me.
PS: If you don't want to allow leading zeroes use "^[1-9]+[0-9]*$".
In retrospect: I have to admit though it's a bit weird to add a regular expression to an integer.