I’ve been searching around and I’m not able to find an answer on what seems like a simple requirement:
With MVC Data Annotation validation, can you show the validation message (‘must be a string with a maximum length of 5’) in the validation summary or next to field, but clear the value of the text box (when validation fails).
I’ve tried to use ModelState.Clear() and ModelState.Remove("CompanyName"), but this clears both the value and validation message (validation state).
I’m asking this because recently we had a penetration test and one of the recommendations was to not pre-populate secure values (credit card number etc) if validation fails. This is obviously a minor issue, but the recommendation was to not send the value back across the internet (from the server) if we didn’t have to.
Here is the code I’m working with:
public ActionResult Edit()
{
return View();
}
[HttpPost]
public ActionResult Edit(CompanyInput input)
{
if (ModelState.IsValid)
{
return View("Success");
}
//ModelState.Clear // clears both the value and validation message
//ModelState.Remove("CompanyName") // same result
return View(new CompanyInput());
}
And the view model:
public class CompanyInput
{
[Required]
[StringLength(5)]
public string CompanyName { get; set; }
[DataType(DataType.EmailAddress)]
public string EmailAddress { get; set; }
}
And the view:
@model Test.Models.CompanyInput
<h2>Edit</h2>
@using (Html.BeginForm("Edit", "Company"))
{
@Html.EditorForModel()
<button type="submit">Submit</button>
}
The ModelState of each field holds more than just the value, so removing it from the collection outright removed your error message as expected. I believe you should be able to clear just the value however, by doing something like.
EDIT: Upon closer inspection I found that the Value property is of type
ValueProviderResult, simply nulling it doesn’t give the desired result, and because the properties of this class appear to be getters only you have to replace the instance with your own. I’ve tested the following and it works for me.