【问题标题】:asp .net MVC 2.0 Validationasp .net MVC 2.0 验证
【发布时间】:2010-05-27 14:56:59
【问题描述】:

我正在尝试在 asp .net MVC 2.0 中为我的应用程序做一些验证。我想要一些不错的客户端验证。验证应在模型端使用具有自定义属性(如 CompareTo、StringLenght、MinPasswordLenght(来自 Membership.MinimumumpassworkdLenght 值)的 DataAnnotations 完成。 为此,我尝试将 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:") %>

两者看起来一样,区别只是验证摘要ID(validationSummary1,validationSummary2)。两个控件都呈现在一个页面上:

Form2
    <%Html.RenderPartial("~/Views/Test/ValidFormControl2.ascx", null); %>
Form1
   
<%Html.RenderPartial("~/Views/Test/ValidFormControl.ascx", null); %>

验证属性

第一个问题,当我们有两个具有相同类型的控件来验证它不起作用时,因为 html 元素是按字段名称呈现的(所以我们有两个具有相同名称的元素“密码”)。只有第一个表单将由客户端验证。 最糟糕的是,即使我们有不同的类型并且它们的字段名称相同,验证也不起作用(这是我需要修复的东西,为验证命名一些独特的属性会很愚蠢)。

有什么解决办法吗?

自定义属性验证

接下来的自定义属性验证(所有这些错误都是当我使用 Ajax 进行正常表单验证时没有问题。):

CompareTo - 简单的比较是在 mvc 模板中为帐户模型完成的(类属性说与两个属性将被比较),它没有显示在页面上。为此,我使用 compareRule 和我的属性创建了自己的 CachingRulesProvider。也许有更简单的方法来做到这一点?

StringLenght 具有最小值和最大值,我不会描述我是如何做到的,但是有没有简单的乳清呢?

验证摘要

当我在页面上有两个两个控件时,所有摘要验证信息都会转到第一个控件验证摘要元素,即使 xval 生成的脚本说摘要的 elementID 也是不同的。有人知道怎么修吗?

验证信息

是否有任何选项可以在 Html.ValidationMessageFor(model => model.ConfirmPassword) 的位置打开消息。因为对我来说它没有出现。我也想获得摘要和近场信息,而不仅仅是红色边框。有人知道怎么做吗?

Ajax 提交

任何人都知道如何在没有大量 javascript 代码的情况下轻松通过 javascript 提交。这将用于将输入提交更改为 href 元素 (a)。 两者看起来一样,区别只是验证摘要ID

【问题讨论】:

  • 这里有很多有效的问题。 SO更适合单个问题。可能值得将这些问题分解并重新发布以获得答案。

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


【解决方案1】:

首先,我不知道你为什么想要两个控件,两个相同的字段,一个表单。每个表单都应该有自己的模型,并使用模型作为验证器。

命名空间 Sample.Models { [元类型(typeof(PersonaValidation))] 公共部分类人 { } 公共类 PersonValidation { [必填(ErrorMessage =“名字必填”)] [StringLength(20, ErrorMessage = "名字长度不得超过 20 个字符")] [显示名称(“名字”)] 公共字符串名字 { 获取;放; }

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

<% } %>

这将每次都有效。错误信息将显示在无效字段旁边。

【讨论】:

    【解决方案2】:

    关于 ajax 提交,您可以在表单上放置一个按钮,然后通过 jQuery 执行单击它。这也会导致您的表单被发布。

    您也可以只对控制器操作进行 ajax 调用(点击链接时),然后在此处发布表单中的必要数据。

    【讨论】:

      猜你喜欢
      • 2011-05-02
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 2013-10-25
      • 2012-06-16
      • 2016-06-22
      • 2014-03-26
      • 1970-01-01
      相关资源
      最近更新 更多