【问题标题】:MVC: Clientside validation stops working in SimpleModal AJAX popup after opening and closing it onceMVC:客户端验证在 SimpleModal AJAX 弹出窗口中打开和关闭一次后停止工作
【发布时间】:2011-03-31 09:45:19
【问题描述】:

我有一个带有简单模式弹出窗口的视图。您单击一个超链接,它会弹出窗口,如果您尝试提交弹出的表单而不填写任何信息,它将在文本框旁边显示适当的验证错误消息。如果您关闭模式弹出窗口并再次单击超链接,则单击提交时似乎没有进行客户端验证。它只是让它被提交,然后它会在服务器端检查时捕获它。为什么打开一个模式弹出窗口然后关闭它,然后第二次重新打开会使验证停止工作?我正在使用SimpleModal Demos 演示的基本 osx 模式。任何建议将不胜感激。我已经检查了该网站,但如果有人以前的帖子可能会有所帮助,我也将不胜感激。

这是我的部分视图文件:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<NSS.Models.Company>" %>
<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>
<fieldset>
    <legend>New Company</legend>

    <div class="editor-label">
        <%: Html.LabelFor(model => model.Company_Name)%>
    </div>
    <div class="editor-field">
        <%: Html.TextBoxFor(model => model.Company_Name)%>
        <%: Html.ValidationMessageFor(model => model.Company_Name)%>
    </div>

    <div class="editor-label">
        <%: Html.LabelFor(model => model.Company_Phone)%>
    </div>
    <div class="editor-field">
        <%: Html.TextBoxFor(model => model.Company_Phone)%>
        <%: Html.ValidationMessageFor(model => model.Company_Phone)%>
    </div>

    <div class="editor-label">
        <%: Html.LabelFor(model => model.Company_Fax)%>
    </div>
    <div class="editor-field">
        <%: Html.TextBoxFor(model => model.Company_Fax)%>
        <%: Html.ValidationMessageFor(model => model.Company_Fax)%>
    </div>

    <div class="editor-label">
        <%: Html.LabelFor(model => model.Company_Website)%>
    </div>

    <div class="editor-field">
        <%: Html.TextBoxFor(model => model.Company_Website)%>
        <%: Html.ValidationMessageFor(model => model.Company_Website)%>
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>

该部分在 .aspx 块中呈现:

<div id='container'>
    <div id='content'>
        <div id='osx-modal'>
            <input type='button' name='osx' value='Demo' class='osx demo'/>
        </div>

        <!-- modal content -->
        <div id="osx-modal-content">
            <div id="osx-modal-title">Create a new Company</div>
            <div class="close"><a href="#" class="simplemodal-close">x</a></div>
            <div id="osx-modal-data">
                <h2>Create a new Company</h2>
                <% Html.RenderPartial("CreateForm", new NSS.Models.Company()); %>
                <p><button class="simplemodal-close">Close</button> <span>(or press ESC or click the overlay)</span></p>
            </div>
        </div>
    </div>
</div>

这是我的验证码:

public class Company_Validation
{
    [Required(AllowEmptyStrings=false, ErrorMessage = "Company Name is required")]
    [StringLength(50, ErrorMessage = "Company Name may not be longer then 50 characters")]
    public string Company_Name { get; set; }
}

【问题讨论】:

    标签: asp.net-mvc ajax validation modal-dialog simplemodal


    【解决方案1】:

    由于 SimpleModal 处理模态内容的方式,听起来它正在失去验证绑定。

    一种选择是使用persist: true 选项,但您可能需要确保清除所有填充的表单值。

    例如:

    $(element).modal({
        persist: true,
        onClose: function (dialog) {
            var modal = this;
            $('input, textarea', dialog.data[0]).val('');
            modal.close();
        }
    });
    

    【讨论】:

    • 就是这样。我开始观察 Visual Studio 如何显示打开的“脚本文档”,并且我的 MicrosoftAjax.js 和 MicrosoftMvcValidation.js 的调用脚本会在我第一次打开模式时出现,但在关闭它并第二次打开它之后两个脚本文件将不再出现。所以失去绑定是有道理的。如果绑定仅在页面加载时发生,而不是在打开模式时发生,那么每次打开模式时我都必须将验证重新绑定到模式以使用验证(如果我没有使用持久选项)?
    • 除非您使用 live() 或 delegate(),否则您每次都必须重新绑定(不带 persist 选项)。这就是 onShow 回调的用途,您可以将绑定代码放在那里,它总是会被调用。
    • 谢谢 Eric,我刚刚意识到我刚刚从 SimpleModal 的创建者那里得到了帮助,很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多