ASP.Net MVC 2中列表的客户端验证

时间:2010-07-22 15:52:07

标签: asp.net-mvc validation collections client-side

我已经多次使用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 个答案:

答案 0 :(得分:3)

终于到了这个底部。基本上,MVC ValidationMessageHelper函数无法为验证帮助程序生成的span元素生成id。 TagBuilder类上的CreateSanitizedId方法返回null,因为modelName是“[0] .Name”而Id不能以字母以外的任何东西开头。然后抛出了KeyNotFoundException,因为TagBuilder没有包含id。

无论如何,解决问题的方法是实现一个简单的View Model,而不是直接将Model设置为一个集合,这样Dogs就是模型的属性,因此用于生成id的modelName变为“Dogs [0] .Name“哪个有效。

答案 1 :(得分: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)%>