2010-03-17 27 views
6

DÜZENLEME: MVC 2.0 asp.net MVC 2.0 ile
bu soru koleksiyonları içeren modeller için mantıklı Doğrulama Özeti yaratma varolan bir yöntem var yükseltilmiş? hiçbir şey gibi görünür girilirseDoğrulama Özet

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; } 
} 

mevcut özeti <%=Html.ValidationSummary %>: değil benim kendi doğrulama özeti

Örnek Modeli oluşturabilirsiniz.

aşağıdaki hata (lar)
*
* giriniz * Lütfen Ad giriniz
* Lütfen Telefon Numarası
giriniz E-posta Adresinizi giriniz sonraki adıma geçmeden önce düzeltilmelidir senin Soyadı
* E-posta Adresinizi giriniz
* giriniz senin Telefon Numarası
* Lütfen Ad
* Lütfen Soyadı giriniz giriniz 0 başlıkları şöyle eklenecek için

tasarım çağırır:

aşağıdaki hata (lar)
Kişi sonraki adıma geçmeden önce düzeltilmelidir
* E-posta Adresinizi giriniz
* giriniz senin Telefon Numarası
* giriniz sizin İsim
* giriniz sizin Soyadı
Perso n
2 *
* * giriniz sizin İsim
* Lütfen Soyadı Pharcyde cevabı dayanarak

Cevap giriniz için telefon numarası
giriniz E-posta Adresinizi giriniz.

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)); 
} 
+1

Ben tamamen aynı sorudan bıktım. Tahmin et o zaman cevap çok fazla değil ..... – Terrance

cevap

3

HtmlHelper yöntemlerini genişletmek ve kendiniz yuvarlamak zorundasınız. Bir gruba gereksinim duyduğunuz durum için önemli olan kodun bitleri:

//HtmlHelper being extended 
if(helper.ViewData.ModelState.IsValid) 
{ 
    foreach(KeyValuePair<string,ModelState> keyPair in helper.ViewData.ModelState) 
    {  
     //add division for group by here using keyPair.Key property (would be named "Person" in your case). 

     foreach(ModelError error in keyPair.Value.Errors) 
     { 
      //now add message using error.ErrorMessage property 
     } 
    } 
} 
+0

Evet, cevabınıza dayanarak kendi yazdım, soruya dahil ettim. – Myster