【问题标题】:MVC2/Jquery validation issuesMVC2/Jquery 验证问题
【发布时间】:2010-10-14 17:08:12
【问题描述】:

我已阅读以下内容: http://weblogs.asp.net/imranbaloch/archive/2010/08/23/asp-net-mvc-jquery-validation-and-validationsummary.aspx

http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

仍然无法让 jQuery 验证与 MVC2 一起使用。我可以让非 jQuery 工作,但是当我换出 JS 文件时它不起作用。它在第 3 天进行,我完全被困在这一点上。所以这就是我所拥有的。感谢您的帮助。

Site.Master

 <script src="<%= this.ResolveClientUrl("~/Resources/js/jquery-1.4.1.js") %>"
        type="text/javascript"></script>
    <script src="<%= this.ResolveClientUrl("~/Resources/js/jquery.validate.js") %>"
        type="text/javascript"></script>
    <script src="<%= this.ResolveClientUrl("~/Resources/js/MicrosoftMvcJqueryValidation.js") %>"
        type="text/javascript"></script>

    <script src="<%= this.ResolveClientUrl("~/Resources/js/ourJS--VERSION--.js") %>" type="text/javascript"></script>
    <script src="<%= this.ResolveClientUrl("~/Resources/js/json2.js") %>" type="text/javascript"></script>
    <link href="../../Resources/css/ourCSS--VERSION--.css" rel="stylesheet" type="text/css" />

视图模型:

namespace OurNamespace
{
    [ExcludeFromCodeCoverage]
    public class OurDataModelView : PersistedDataModelView
    {
        public OurModelView () : base()
        {
            ID = -1;
            StartDate = DateTime.MinValue;
            EndDate = DateTime.MinValue;
            Description = string.Empty;
            Deleted = false;
        }

        [DisplayFormat(DataFormatString = "{0:MM/yyyy}")]
        public DateTime? StartDate { get; set; }

        [DisplayFormat(DataFormatString = "{0:MM/yyyy}")]
        public DateTime? EndDate { get; set; }

        [Required(ErrorMessage="Description is required.")]
        [StringLength(250000, ErrorMessage = "A maximum of 250000 characters are allowed")]
        public string Description { get; set; }

        public int? ID { get; set; }

        public bool Deleted { get; set; }
    }
}

ASPX 页面

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
...
 <% Html.RenderAction(WebConstants.ACTION_DISPLAY_HEADER, WebConstants.CONTROLLER, new { id = ViewData["ID"] }); %>
...

我们对验证完成的部分观点:

 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<OurNameSpace.OurDataModelView>" %>
...
        <% Html.EnableClientValidation(); %>
        <% using (Html.BeginForm("", "", FormMethod.Post , new { id = "HeaderForm", onSubmit="return false;"})) { %>
        <%: Html.ValidationSummary(false, "validation failed") %>
        <%: Html.HiddenFor(model => model.ID) %>
        <div class="form-row">
            <div class="form-label">Description</div>
            <div class="form-element"><%: Html.TextAreaFor(model => model.Description)%></div>
            <div><%= Html.ValidationMessageFor(model => model.Description) %></div>
        </div>

        <div class="buttons">
            <input id="Save" type="submit" class="save-button" value="" />
            <div id="Cancel" class="cancel-button"></div>
        </div>

        <% } %>
...

**SO by doesn't work here 是我所看到的。 在查看源我看到:

//<![CDATA[
if (!window.mvcClientValidationMetadata) { window.mvcClientValidationMetadata = []; }
window.mvcClientValidationMetadata.push({"Fields":[{"FieldName":"Description","ReplaceValidationMessageContents":true,"ValidationMessageId":"Description_validationMessage","ValidationRules":[{"ErrorMessage":"A maximum of 250000 characters are allowed","ValidationParameters":{"minimumLength":0,"maximumLength":250000},"ValidationType":"stringLength"},{"ErrorMessage":"Description is required.","ValidationParameters":{},"ValidationType":"required"}]}],"FormId":"HeaderForm","ReplaceValidationSummary":true,"ValidationSummaryId":"validationSummary"});
//]]>

但是,客户端验证没有出现。我单击 char 中的 textarea 类型并将其从元素中删除,然后没有任何反应。调试这个有什么想法吗?

【问题讨论】:

  • 我最终找到了问题所在。其中一位开发人员创建了一个 JS 方法,可以将页面上的模块转换为 div 结构,这样他也可以应用样式。这通过 .html() 方法获取模块子级,并将其连接到具有新结构的字符串上。这当然破坏了该元素的所有绑定。如果其他人有这个问题,我最终会发布我是如何调试的。

标签: asp.net-mvc-2 jquery-validate


【解决方案1】:

这是一个非常简单的工作示例:

型号:

public class MyViewModel
{
    [Required(ErrorMessage = "Description is required.")]
    [StringLength(10, ErrorMessage = "A maximum of 10 characters are allowed")]
    public string Description { get; set; }
}

控制器:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }
}

查看:

<script type="text/javascript" src="<%= Url.Content("~/scripts/jquery-1.4.1.js") %>"></script>
<script type="text/javascript" src="<%= Url.Content("~/scripts/jquery.validate.js") %>"></script>
<script type="text/javascript" src="<%= Url.Content("~/scripts/MicrosoftMvcJQueryValidation.js") %>"></script>

<% Html.EnableClientValidation(); %>

<% using (Html.BeginForm()) { %>
    <%: Html.TextAreaFor(x => x.Description)%></div>
    <%: Html.ValidationMessageFor(x => x.Description) %>
    <input type="submit" value="OK" />
<% } %>

MicrosoftMvcJQueryValidation.js 不包含在标准项目模板中,因为它是MVC Futures project 的一部分(从源代码中提取)。

一旦您将这个示例付诸实施并证明它可以工作,您就可以开始添加功能了。

【讨论】:

  • 我已经尝试过所有这些。我们的应用程序现在已经成熟,可以剥离所有内容并重建它。好吧,到目前为止,这只是作为最后的手段,因为它需要一周的时间才能正确完成。我今天正在深入研究 MS 和 JQuery js 文件。如果这并不能带来太多收益,那么我们可能会放弃它,因为我们不必花时间来构建一个实际上只会在重复重复代码中节省一些代码/错误的功能。在我们花费的时间里,我们可以写两次双方的所有验证。不过谢谢。
猜你喜欢
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 2017-08-29
相关资源
最近更新 更多