EDIT: Upgrade dieser Frage zu MVC 2.0
mit asp.net MVC 2.0 gibt es eine bestehende Methode Validation Zusammenfassung erstellen, die enthalten Sammlungen Sinn für Modelle macht? Wenn nicht, kann ich meine eigene Validierung ZusammenfassungValidation Zusammenfassung für Sammlungen
Beispielmodell erstellen:
public class GroupDetailsViewModel
{
public string GroupName { get; set; }
public int NumberOfPeople { get; set; }
public List<Person> People{ get; set; }
}
public class Person
{
[Required(ErrorMessage = "Please enter your Email Address")]
[RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", ErrorMessage = "Please enter a valid Email Address")]
public string EmailAddress { get; set; }
[Required(ErrorMessage = "Please enter your Phone Number")]
public string Phone { get; set; }
[Required(ErrorMessage = "Please enter your First Name")]
public string FirstName { get; set; }
[Required(ErrorMessage = "Please enter your Last Name")]
public string LastName { get; set; }
}
Die bestehende Zusammenfassung <%=Html.ValidationSummary %>
wenn nichts sieht wie folgt eingegeben wird.
Der folgende Fehler (n) muss mit dem nächsten Schritt, bevor Sie fortfahren
* Bitte geben Sie Ihre E-Mail-Adresse
* Bitte geben Sie Ihren Vornamen
* Bitte geben Sie
* Bitte geben Sie Ihre Telefonnummer korrigiert werden geben Sie Ihren Nachnamen
* Bitte Ihre E-Mail-Adresse
* Bitte geben Sie Ihre Telefonnummer
* Bitte geben Sie Ihren Vornamen
* Bitte geben Sie Ihren Nachnamen
Der Entwurf fordert Überschriften wie diese eingefügt:
Der folgende Fehler (n) muss vor dem nächsten Schritt fortfahren
Person 1
* Bitte geben Sie Ihre E-Mail-Adresse korrigiert werden
* Bitte geben Sie Ihre Telefonnummer
* Bitte geben Sie Ihren Vornamen
* Bitte geben Sie Ihren Nachnamen
Perso n 2
* Bitte geben Sie Ihre E-Mail-Adresse
* Bitte geben Sie Ihre Telefonnummer
* Bitte geben Sie Ihren Vornamen
* Bitte geben Sie Ihren Nachnamen
Antwort Basierend auf Pharcyde Antwort.
public static MvcHtmlString NestedValidationSummary(this HtmlHelper helper)
{
if (helper.ViewData.ModelState.IsValid)
return MvcHtmlString.Empty;
// create datastructure to group error messages under a given key (blank key is for general errors)
var errors = new Dictionary<string,List<string>>();
foreach (KeyValuePair<string, ModelState> keyPair in helper.ViewData.ModelState)
{
foreach (ModelError error in keyPair.Value.Errors)
{
//determine the 'key' for the group in which this error belongs
var key = keyPair.Key.Split(']')[0];
if (key.Contains("People["))
key = "Person " + key.Split('[')[1];
else
key = string.Empty;
if(!errors.ContainsKey(key))
errors.Add(key,new List<string>());
//now add message using error.ErrorMessage property
errors[key].Add(error.ErrorMessage);
}
}
// generate the HTML
var ul = new TagBuilder("ul");
foreach (KeyValuePair<string, List<string>> errorPair in errors.OrderBy(p=>p.Key))
{
var li = new TagBuilder("li");
if(!string.IsNullOrEmpty(errorPair.Key))
li.InnerHtml += string.Format("<p class=\"no-bottom-margin\"><strong>{0}</strong></p>",errorPair.Key);
var innerUl = new TagBuilder("ul");
foreach (var message in errorPair.Value)
{
var innerLi = new TagBuilder("li");
innerLi.InnerHtml = message;
innerUl.InnerHtml += innerLi.ToString(TagRenderMode.Normal);
}
li.InnerHtml += innerUl.ToString(TagRenderMode.Normal);
ul.InnerHtml += li.ToString(TagRenderMode.Normal);
}
return MvcHtmlString.Create(ul.ToString(TagRenderMode.Normal));
}
Ich hatte total gerade die gleiche freakin Frage. Schätze dann ist die Antwort nicht so viel ..... – Terrance