ajax - MVC3 与 Ajax 部分 View - 未执行 OnBegin 验证

标签 ajax asp.net-mvc-3 unobtrusive-validation asp.net-mvc-partialview client-side-validation

在 MVC3 应用程序中,我有一个 View 呈现两个 Ajax 部分 View :一个创建部分 View 和一个 ListView 。在创建部分 View 中,我尝试在 OnBegin 事件上触发客户端验证,但这不会发生。

当我强制错误时,我得到的错误消息是模型注释中指示的消息,而不是我在名为 OnBegin 的验证函数中定义的消息(例如:

  • 将事件地点留空,我得到“事件地点是必需的”(注释),而不是“它在哪里发生?”(FieldsValidation函数),

  • 对于事件描述,我得到“需要事件描述”(注释),而不是“告诉我们有关它的信息!”(FieldsValidation 函数)

  • 验证摘要消息显示“创建时出错。请更正后重试。”而不是“保存失败。请更正错误并重试。” (FieldsValidation 函数))。

我尝试在 FieldsValidation 函数中设置断点,但从未到达。 为了确定,我还尝试调用 OnBegin 一个显示警报的函数(测试后我恢复了对 FieldsValidation 函数的原始调用):

    function toDoOnBegin() { alert("This is onBegin"); }

警报永远不会显示!

如果所有字段均正确填写,则事件将正确创建并显示在事件列表(另一个部分 View )中。问题出在函数调用 OnBegin 上。

请解释一下我做错了什么,我是否错过了包含某些内容或者还有什么?

真心感谢。

Web.config

<appSettings>
    <add key="webpages:Version" value="1.0.0.0" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>

型号:

    public partial class Event
{
    public int client_ID { get; set; }

    [Required(ErrorMessage="The event date is required")]
    [DataType(DataType.Date, ErrorMessage="The event date is invalid")]
    public System.DateTime event_date { get; set; }

    [Required(ErrorMessage="The event place is required")]
    public string event_place{ get; set; }

    [Required(ErrorMessage="The event description is required")]
    public string event_description{ get; set; }
}

_Layout.cshtml:

样式表

<link href="@Url.Content("~/Content/styles.css")" rel="stylesheet" type="text/css" />
<link href="@Url.Content("~/Content/nivo-slider.css")" rel="stylesheet" type="text/css" media="screen"/>
<link href="@Url.Content("~/Content/themes/redmond/jquery-ui-1.8.18.custom.css")" rel="stylesheet" type="text/css" />
<link href="@Url.Content("~/Content/jquery.timepicker.css")" rel="stylesheet" type="text/css" />  
<link href="@Url.Content("~/Content/jquery.alerts.css")" rel="stylesheet" type="text/css" media="screen"/>

其他几个页面需要 jQueries for datetimepicker 插件

<script src="@Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery-ui-1.8.18.custom.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.ui.core.min.js")"  type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.ui.slider.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.ui.datepicker.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.ui.datepicker-fr.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery-ui-timepicker-addon.js")" type="text/javascript"></script>

其他应用程序组件的 jQueries

<script src="@Url.Content("~/Scripts/jquery.alerts.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/OJscript.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.nivo.slider.pack.js")" type="text/javascript"></script>

用于验证的 jQueries

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>

Index.cshtml

@model MyApp.ViewModels.EventViewModel

@{
    ViewBag.Title = "Events";
}

<div id="divUpdateable">
    @Html.Partial("_Create", Model)
</div>
<div id="divList">
    @Html.Partial("_ListEvents", Model.EventsList)
</div>

_Create.cshtml

@model MyApp.ViewModels.EventViewModel

<script type="text/javascript">

    function FieldsValidation() {
        $("#idformCreate").validate({

            errorContainer: $($('div.validation-summary-errors')),
            errorLabelContainer: $("ul", $('div.validation-summary-errors')),
            wrapper: 'li',
            errorClass: "input-validation-error2",

            rules:
                {
                    'Event.event_date':
                    {
                        required: true
                    },
                    'Event.event_place':
                    {
                        required: true
                    },
                    'Event.event_description':
                    {
                        required: true
                    }
                },
            messages:
                {
                    'Event.event_date':
                    {
                        required: "Date is required"
                    },
                    'Event.event_place':
                    {
                        required: "Where did it take place?"
                    },
                    'Event.event_description':
                    {
                        required: "Tell us sth about it!"
                    }
                }

        }).form();

        if (!$("#idformCreate").valid()) {
            $("div.validation-summary-errors span").html("Save failed. Please correct errors and retry.");
            return false;
        }

        return true;
    }
</script>

@using (Ajax.BeginForm("Create", "Event", new { clientID = Model.Event.client_ID }, new AjaxOptions
{
    UpdateTargetId = "divUpdateable",
    OnBegin = "FieldsValidation",
    InsertionMode = InsertionMode.Replace,
    OnSuccess = "getForm('" + Url.Action("ListEvents", "Event", null) + "','divList')"
}, new { id = "idformCreate" }))
{
    @Html.ValidationSummary(false, "Error on creation. Please retry after corrections.")
    <p>@Html.ValidationMessage("_FORM")</p>
    <div class="validation-summary-errors">
        <span></span>
        <ul>
        </ul>
    </div>
    <fieldset style="width: 800px; line-height: 1.4em;">
        <legend>Add an event</legend>
        <table style="width: 100%; padding-bottom: 0; padding-top: 0; border: 0;">
            <tr>
                <td style="width: 90px; border: 0;">
                    @Html.LabelFor(model => model.Event.event_date)
                </td>
                <td style="width: 200px; border: 0;">
                    @Html.EditorFor(model => model.Event.event_date, new { @class = "date" })
                    @Html.ValidationMessageFor(model => model.Event.event_date, "*")
                    @Html.HiddenFor(model => model.Event.client_ID)
                </td>
            </tr>
            <tr>
                <td style="width: 80px; border: 0; text-align: right;">
                    @Html.LabelFor(model => model.Event.event_place)
                </td>
                <td style="width: 120px; border: 0;">
                    @Html.DropDownList("Event.event_place", Model.PlacesList, "Where?", new { @style = "width: 100px;" })
                    @Html.ValidationMessageFor(model => model.Event.event_place, "")
                </td>
            </tr>
            <tr>
                <td style="width: 90px; border: 0;">
                    @Html.LabelFor(model => model.Event.event_description)
                </td>
                <td style="width: 600px; border: 0;" colspan="5">
                    @Html.TextAreaFor(model => model.Event.event_description, new { @class = "input_txt_nofloat", @style = "width:590px" })
                    @Html.ValidationMessageFor(model => model.Event.event_description, "*")
                </td>
            </tr>
            <tr style="height: 64px;">
                <td colspan="2" style="text-align: center;">
                    <br />
                    <br />
                    <input type="submit" value="Save" class="submit" style="width: 280px" />
                 </td>
            </tr>
        </table>
    </fieldset>
}

最佳答案

Here is the answer: (非常感谢布罗克艾伦)

If you are doing your own client-side validation then you should remove jquery.validate.unobtrusive.min.js. This is MVC's client side validation code and they will conflict if both are using jquery.validate.

希望这对其他人也有帮助。

关于ajax - MVC3 与 Ajax 部分 View - 未执行 OnBegin 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9832407/

相关文章:

php - $.ajax( 类型 : "POST" POST method to php

asp.net-mvc - 将 Orchard CMS 部署到共享主机的正确方法是什么?

c# - 如何访问用户注册时给出的 'name'

javascript - 如何制作一个高效的基于ajax的javascript脚本

jquery - ajax返回后提交表单

c# - MVC3 应用重定向到 ReturnUrl=%2f

c# - 服务器和客户端验证差异增加了额外的跨度

javascript - Jquery 不显眼的验证 : add class to label of invalid field

jquery - 添加 MVC3 不显眼的验证 (addMinMax)

php - 如何从 Ajax 调用的 PHP 循环中获取正确的 onclick ID?