asp .net MVC 2.0验证

时间:2010-05-27 14:56:59

标签: c# .net asp.net-mvc asp.net-mvc-2

我正在尝试在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

2 个答案:

答案 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调用(在链接点击时),然后在此处从表单中发布必要的数据。