2010-07-22 2 views
2

Я использовал stackoverflow много раз, чтобы решить свои проблемы (связанный с кодом!), Но это первый раз, когда мне нужно было задать вопрос, потому что я не могу работать что не так.Проверка на стороне клиента в ASP.Net MVC 2

Когда я включить на стороне клиента проверки на вид, что позволяет редактировать коллекции объектов, которые используют DataAnnotations для проверки поднимается следующее исключение:

[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)%> 

Если удалить <% Html.EnableClientValidation(); %> вызова исключение не поднимается и проверка на стороне сервера работает должным образом.

Вот мой тест Модель:

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

и вид:

<%@ 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> 

Любые идеи о том, как получить эту работу будут оценены как его делаю свою голову в попытке получить это работать !!!

Благодаря

ответ

3

Наконец-то попал на дно этого. В основном функция MVC ValidationMessageHelper не создавала идентификатор для элемента span, сгенерированного помощником проверки. Метод CreateSanitizedId класса TagBuilder возвращал значение null, потому что modelName был «[0] .Name», и Id не может начинаться ни с чем, кроме буквы. В результате KeyNotFoundException было выброшено, поскольку TagBuilder не содержал идентификатор.

В любом случае, проблема заключалась в том, чтобы реализовать простую модель просмотра вместо того, чтобы устанавливать модель как коллекцию напрямую, чтобы Собаки были свойством на модели, и поэтому modelName, используемое для генерации идентификатора, становится «Dogs [0 ]. Имя ", которое работает.

0

Я думаю, что проблема может быть с именами ... я имею в виду, так как вы используете -

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

я не могу проверить прямо сейчас, но это может работы-

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

Спасибо за это, но радости нет. Я попробовал изменить имя свойства на имя DogsName после вашего запроса, но это тоже не сработало. Затем попробовал Html.ValidationMessage (String.Format («Model [{0}]. DogsName», i.ToString())), который не вызвал ошибку, но не было подтверждено никаких сообщений проверки, а затем попытался удалить Model Html.ValidationMessage (String.Format ("[{0}]. DogsName", i.ToString())), и исходное исключение снова возникает! Я думаю, это показывает нам, что делает MVC, но не помогает мне придумать ответ! Любые идеи? – Andy

Смежные вопросы