我正在尝试在asp .net MVC 2.0中为我的应用程序做一些验证。我想要一些不错的客户端验证。使用带有自定义属性的DataAnnotations(如CompareTo,StringLenght,MinPasswordLenght(来自Membership.MinimumumpassworkdLenght值),应在模型端进行大部分时间的验证。 为此,我尝试使用xval和jquery.validation。 一些具体的事情是,大多数表单将使用ajax,大多数问题是当我想用ajax验证表单时。
以下是示例项目http://www.sendspace.com/file/m9gl54的链接。
我有两个表单作为控件ValidFormControl1.ascx,ValidFormControl2.ascx
<% using (Ajax.BeginForm("CreateValidForm", "Test", new AjaxOptions { HttpMethod = "Post" })) {%> <div id="validationSummary1">
<%= Html.ValidationSummary(true)%> </div> <fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%= Html.LabelFor(model => model.Name)%>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Name)%>
<%= Html.ValidationMessageFor(model => model.Name)%>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.Email)%>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Email)%>
<%= Html.ValidationMessageFor(model => model.Email)%>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.Password)%>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Password)%>
<%= Html.ValidationMessageFor(model => model.Password)%>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.ConfirmPassword)%>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.ConfirmPassword)%>
<%= Html.ValidationMessageFor(model => model.ConfirmPassword)%>
</div>
<p>
<input type="submit" value="Create" />
</p> </fieldset> <% } %> <%= Html.ClientSideValidation<ValidModel>()
.UseValidationSummary("validationSummary1", "Please fix the following problems:") %>
两者看起来相同,区别仅在于验证summaryID(validationSummary1,validationSummary2)。两个控件都在一个页面上呈现:
Form2
<%Html.RenderPartial("~/Views/Test/ValidFormControl2.ascx", null); %>
Form1
<%Html.RenderPartial("~/Views/Test/ValidFormControl.ascx", null); %>
验证属性
第一个问题,当我们有两个相同类型的控件来验证它时不起作用因为html元素是由字段名称呈现的(所以我们有两个同名“Password”的元素)。只有第一个表单将由客户端验证。 最糟糕的是,即使我们有不同的类型和他们的字段名称是相同的验证也不会工作(这是我需要修复它是愚蠢的命名一些独特的适当的验证)。
有什么解决方法吗?
自定义属性验证
下一步自定义属性验证(所有这些错误都是在我使用Ajax进行正常表单验证时工作没有问题。):
CompareTo - 简单比较在mvc模板中为帐户模型完成(类属性说两个属性将被比较),并且它没有在页面上显示。为此,我使用compareRule和我的属性创建了自己的CachingRulesProvider。也许还有更简单的方法吗?
具有最小值和最大值的StringLenght,我不会描述我是如何做到的,但有任何容易的乳清吗?
验证摘要
当我在页面上有两个两个控件时,所有摘要验证信息都会转到第一个控制验证摘要元素,即使是xval生成的脚本也表示elementID对于摘要是不同的。谁知道如何修复它?
验证信息
是否有任何选项可以打开Html.ValidationMessageFor(model =&gt; model.ConfirmPassword)的地方的消息。对我而言,它并没有出现。我想有总结和近场信息,不仅是红色边框。谁知道怎么做?
Ajax提交
任何人都知道如何在没有javascript的大量代码的情况下轻松做到通过javascript提交。这将用于将输入提交更改为href元素(a)。 两者看起来相同,区别仅在于验证摘要ID
答案 0 :(得分:0)
首先,我不知道为什么你想要两个控件,有两个相同的字段,一个表单。每个表单都应该有自己的模型,并使用模型作为验证器。
命名空间Sample.Models { [元类型(typeof运算(PersonaValidation))] 公共部分人员 { } 公共类PersonValidation { [必需(ErrorMessage =“名字必需”)] [StringLength(20,ErrorMessage =“名字长度必须为20个或更少”)] [DisplayName(“名字”)] public string名字{get;组; }
[Required(ErrorMessage = "Last name Required")]
[StringLength(20, ErrorMessage = "Last name must be 20 or less characters in length")]
[DisplayName("Last Name")]
public string Lastname { get; set; }
} }
在您的aspx中,在表单标记之前添加以下脚本文件:
<h2>Validation Sample</h2>
<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>
<script src="/Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script>
<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm()) {%>
<%= Html.ValidationSummary(true) %>
<fieldset>
<div class="editor-label">
<%= Html.LabelFor(model => model.Firstname) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Firstname) %>
<%= Html.ValidationMessageFor(model => model.Firstname) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.Lastname) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Lastname) %>
<%= Html.ValidationMessageFor(model => model.Lastname) %>
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
<% } %>
每次都会有效。错误消息将显示在无效字段旁边。
答案 1 :(得分:0)
关于ajax提交,你可以在表单上放一个按钮,然后通过jQuery点击它。这也会导致您的表单被发布。
您也可以对控制器操作进行ajax调用(在链接点击时),然后在此处从表单中发布必要的数据。