What is the point of the key parameter in ModelState.AddModelError in ASP.NET MVC?

C#.Netasp.net Mvc

C# Problem Overview


I've added validation checks in my controller that modify the ModelState if the validation fails.

For example:

private bool ValidateMoney(string raw, string name, decimal min, decimal max) {
    try {
        var dec = Convert.ToDecimal(raw);

        if (dec < min) {
            throw new ArgumentOutOfRangeException(name + " must be >= " + min);
        }
        else if (dec > max) {
            throw new ArgumentOutOfRangeException(name + " must be <= " + max);
        }
    }
    catch (Exception ex) {
        ModelState.AddModelError(name, ex.GetUserMessage());
    }
    return ModelState.IsValid;
}

However, I never know value to pass for the key parameter in ModelState.AddModelError. (In the example, I just set it to my UI display name.)

What is the parameter for and how should I use it?

C# Solutions


Solution 1 - C#

The Key is used by the ValidationMessage HTML Helper to know the exact error message to display.

Example:

<%=Html.TextBox("Name") %> <br />
<%=Html.ValidationMessage("Name") %>

the ValidationMessage helper will display the message that has the key "Name" in the ModelState dictionary.

Solution 2 - C#

The key parameter can be used to associate the validation error with a form field, and thus control where the message appears on-screen. It can be used with both HtmlHelper-type inputs and with simple HTML inputs.

If you've used @Html.TextBoxFor (or similar) and a @Html.ValidationMessageFor, you can get the key's value from the HTML name of the field being validated (use Inspect Element).

If you've just used an HTML <input>, you can add a validation placeholder using @Html.ValidationMessage("AKeyIMadeUp"), and get a message to appear in it like this: ModelState.AddModelError("AKeyIMadeUp", "The value you entered is no good");.

Solution 3 - C#

Sorry to Necropost. The above answers didn't have this detail that I thought was useful (it was what I was looking for!!)

In order to create 'Model Wide' Validation errors - then you simply add string.Empty as your Key.

e.g.

ModelState.AddModelError(string.Empty, "This is my Model Level Message");

Thanks to : http://www.tutorialsteacher.com/mvc/htmlhelper-validationsummary for the tip.

Solution 4 - C#

Actually you can set any validation message while your form submission unsuccessful suppose you make a field in model

[Required]
    [DataType(DataType.Password)]
    [Display(Name = "Current password")]
    public string OldPassword { get; set; }

and while your modelState got invalid you can set error message bind with that field like as.

ModelState.AddModelError("OldPassword", "Current Password do not match ");

then your error message will be bind with field in model named "OldPassword"

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionFrank KruegerView Question on Stackoverflow
Solution 1 - C#user434917View Answer on Stackoverflow
Solution 2 - C#OutstandingBillView Answer on Stackoverflow
Solution 3 - C#yeti_cView Answer on Stackoverflow
Solution 4 - C#mk MughalView Answer on Stackoverflow