2010-07-22 5 views
2

J'ai utilisé stackoverflow plusieurs fois pour résoudre mes problèmes (liés au code!) Mais c'est la première fois que j'ai besoin de poster une question parce que je ne peux pas m'entraîner Qu'est-ce qui ne va pas.Validation côté client de la liste dans ASP.Net MVC 2

Quand activer la validation du côté client sur une vue qui permet de modifier une collection d'objets qui utilisent DataAnnotations pour validation, l'exception suivante est soulevée:

[KeyNotFoundException: The given key was not present in the dictionary.] 
System.Collections.Generic.SortedDictionary`2.get_Item(TKey key) +6129977 
System.Web.Mvc.Html.ValidationExtensions.ValidationMessageHelper(HtmlHelper htmlHelper, ModelMetadata modelMetadata, String expression, String validationMessage, IDictionary`2 htmlAttributes) +840 
System.Web.Mvc.Html.ValidationExtensions.ValidationMessageFor(HtmlHelper`1 htmlHelper, Expression`1 expression, String validationMessage, IDictionary`2 htmlAttributes) +138 
System.Web.Mvc.Html.ValidationExtensions.ValidationMessageFor(HtmlHelper`1 htmlHelper, Expression`1 expression) +106 
ASP.views_test_test_aspx.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in d:\SVN\Discover2 - trunk\Discover2.Web\Views\Test\Test.aspx:18 
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +109 
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 
System.Web.UI.Page.Render(HtmlTextWriter writer) +29 
System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) +56 
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3060 

Line 18: <%: Html.ValidationMessageFor(m => Model[i].Name)%> 

Si je supprime l'appel <% Html.EnableClientValidation(); %> aucune exception est soulevée et La validation côté serveur fonctionne comme prévu.

Voici mon test Modèle:

public class Dog { 
    [Required] 
    public string Name { get; set; } 
} 

et vue:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<IList<Discover2.Web.Controllers.Dog>>" %> 
<% Html.EnableClientValidation(); %> 
<%using (Html.BeginForm()) { %> 
<%for (int i = 0; i < Model.Count(); i++) {%> 
    <div> 
     <%: Html.LabelFor(m => Model[i].Name) %> 
     <%: Html.TextBoxFor(m => Model[i].Name)%> 
     <%: Html.ValidationMessageFor(m => Model[i].Name)%> 
    </div> 
<%} %> 
<button type=submit>Save</button> 

Toutes les idées sur la façon d'obtenir ce travail serait apprécié comme fais ma tête en essayant d'obtenir ça fonctionne !!!

Merci

Répondre

3

Enfin arrivé au fond de celui-ci. Fondamentalement, la fonction MVC ValidationMessageHelper ne réussissait pas à générer un identifiant pour l'élément span généré par l'assistant de validation. La méthode CreateSanitizedId de la classe TagBuilder renvoyait null car modelName était "[0] .Name" et Id ne peut pas commencer par autre chose qu'une lettre. L'exception KeyNotFoundException était alors lancée car TagBuilder ne contenait pas d'identifiant. Quoi qu'il en soit, le problème consistait à implémenter un simple modèle de vue au lieu de définir directement le modèle pour que Dogs devienne une propriété du modèle et donc modelName utilisé pour générer l'identifiant devient "Dogs [0]. ] .Name "qui fonctionne.

0

Je pense que le problème peut-être avec les noms ... je veux dire depuis que vous utilisez -

<%: Html.TextBoxFor(m => Model[i].Name)%> 
<%: Html.ValidationMessageFor(m => Model[i].Name)%> 

je ne peux pas tester en ce moment, mais cela pourrait TRAVAiL

<%: Html.Label("Name",Model[i].Name) %> 
<%: Html.TextBox("Name", Model[i].Name)%> 
<%: Html.ValidationMessage("Name",Model[i].Name)%> 
+0

Merci pour cela, mais pas de joie là-bas. J'ai essayé de changer le nom de la propriété à DogsName après votre suggestion sur les noms, mais cela n'a pas fonctionné non plus. Ensuite essayé Html.ValidationMessage (String.Format ("Modèle [{0}]. DogsName", i.ToString())) qui n'a pas déclenché l'erreur mais aucun message de validation n'a été affiché, puis a essayé de supprimer Model Html.ValidationMessage (String.Format ("[{0}]. DogsName", i.ToString())) et l'exception d'origine est à nouveau levée! Je suppose que cela nous montre ce que fait MVC mais ne m'aide pas à trouver une réponse !! D'autres idées? – Andy

Questions connexes