Проверка на стороне клиента списка в ASP.Net MVC 2 - PullRequest
2 голосов
/ 22 июля 2010

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

Когда я включаю проверку на стороне клиента в представлении, которое позволяет редактировать коллекцию объектов, которые используют 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>

Буду признателен за любые идеи о том, как заставить это работать, потому что я пытаюсь заставить это работать !!!

Спасибо

Ответы [ 2 ]

3 голосов
/ 17 августа 2010

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

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

0 голосов
/ 22 июля 2010

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

<%: 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)%>
...