使用无障碍 JQuery 在部分视图中显示错误消息时遇到问题

2024-01-08

以下是我在 MVC3 中的区域

Model

public class AdminModule
{
    [Display(Name = "My Name")]
    [Required]
    public String MyName { get; set; }
}

局部视图

@model _1.Areas.Admin.Models.AdminModule
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myForm" }))
{
    @Html.LabelFor(i => i.MyName)
    @Html.TextBoxFor(i => i.MyName)
    @Html.ValidationMessageFor(i => i.MyName)
    <p id="getDateTimeString">
    </p>
    <input type="submit" value="Click here" id="btn" />
}

<script language="javascript" type="text/javascript">
    $('#btn1').click(function () {
        debugger;
        var $form = $("#myForm");

        // Unbind existing validation
        $form.unbind();
        $form.data("validator", null);

        // Check document for changes
        $.validator.unobtrusive.parse(document);

        // Re add validation with changes
        $form.validate($form.data("unobtrusiveValidation").options);

        if ($(this).valid()) {
            var url = '@Url.Action("Index_partialPost", "Admin", 
                                                new { area = "Admin" })';
            $.post(url, null, function (data) {
                alert(data);
                $('#myForm').html(data);
            });
        }
        else

        return false;
    });
</script>

控制器动作

[HttpPost]
public ActionResult Index_partialPost(AdminModule model)
{
    return PartialView("_PartialPage1", model);
} 

[HttpGet]
public ActionResult Index_partial()
{
    return PartialView("_PartialPage1");
}

每当我提交表单并将必填字段留空时。我认为它会发送到服务器。我在这里检查过...

我的困惑是=> 如何修改下面提到的代码以使用 $.post 在客户端显示模型中提到的相同验证消息?


您可以启用不显眼的客户端验证。首先添加以下脚本引用:

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

进而:

@model _1.Areas.Admin.Models.AdminModule
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myForm" }))
{
    @Html.LabelFor(i => i.MyName)
    @Html.TextBoxFor(i => i.MyName)
    @Html.ValidationMessageFor(i => i.MyName)
    <p id="getDateTimeString"></p>
    <input type="submit" value="Click here" />
}

<script type="text/javascript">
    $('#myForm').submit(function () {
        if ($(this).valid()) {
            $.post(this.action, $(this).serialize(), function(data) {
                $('#myForm').html(data);

                $('#myForm').removeData('validator');
                $('#myForm').removeData('unobtrusiveValidation');
                $.validator.unobtrusive.parse('#myForm');
            });
        }
        return false;
    });
</script>

UPDATE:

现在您通过电子邮件向我发送了实际代码,我发现它存在很多问题。与其经历所有这些,我更喜欢从头开始完全重写所有内容。

所以我们从~/Areas/Admin/Views/Shared/_LayoutPage1.cshtml:

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
</head>
<body>
    <div>
        <ul>
            <li>@Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)</li>
        </ul>
        @RenderBody()
    </div>
    <script src="/Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
    <script src="/Scripts/jquery.validate.js" type="text/javascript"></script>
    <script src="/Scripts/jquery.validate.unobtrusive.js" type="text/javascript"></script>
    @RenderSection("Scripts", required: false)
</body>
</html>

请注意我如何将所有脚本移至文件底部,并添加一个专门用于放置自定义脚本的部分。

接下来我们转到~/Areas/Admin/Views/Admin/Index.cshtml:

@model _1.Areas.Admin.Models.AdminModule
@{
    ViewBag.Title = "Index";
    Layout = "~/Areas/Admin/Views/Shared/_LayoutPage1.cshtml";
}

<div id="formContainer" data-url="@Url.Action("Index_partial", "Admin", new { area = "Admin" })"></div>
<input id="BTN" type="button" value="Button" />

@section Scripts {
    <script type="text/javascript" src="@Url.Content("~/areas/admin/scripts/myscript.js")"></script>
}

在这里您可以注意到我已经替换了按钮的类型submit to button因为此按钮不包含在要提交的表单中。我也摆脱了<p>你正在经历的元素id="myForm"这不仅没有用,而且最终会在 DOM 中出现重复的 id,这是无效的标记。我也用过data-url容器 div 上的 HTML5 属性指示将加载表单的服务器端脚本的 url。我在这个文件中做的最后一件事是覆盖scripts我们之前在布局中使用自定义脚本定义的部分。

所以下一部分是自定义脚本:~/areas/admin/scripts/myscript.js:

$('#BTN').click(function () {
    var $formContainer = $('#formContainer');
    var url = $formContainer.attr('data-url');
    $formContainer.load(url, function () {
        var $form = $('#myForm');
        $.validator.unobtrusive.parse($form);
        $form.submit(function () {
            var $form = $(this);
            if ($form.valid()) {
                $.post(this.action, $(this).serialize(), function (data) {
                    $form.html(data);
                    $form.removeData('validator');
                    $form.removeData('unobtrusiveValidation');
                    $.validator.unobtrusive.parse($form);
                });
            }
            return false;
        });
    });
    return false;
});

这里的代码非常标准。我们订阅按钮的单击事件并使用 AJAX 调用加载部分内容。一旦完成,我们就会指示不显眼的验证框架解析新添加到 DOM 的内容。下一步是通过订阅来 AJAX 化表单.submit事件。并且因为在success我们再次替换容器的内容,我们需要指示不显眼的验证框架解析新内容。

最后是部分:

@model _1.Areas.Admin.Models.AdminModule

@using (Html.BeginForm("Index_partialPost", "Admin", FormMethod.Post, new { id = "myForm" }))
{
    @Html.LabelFor(i => i.MyName)
    @Html.TextBoxFor(i => i.MyName)
    @Html.ValidationMessageFor(i => i.MyName)
    <p id="getDateTimeString"></p>
    <input type="submit" value="Click here" />
}

在这里你可以注意到我已经完全摆脱了任何 javascript 的痕迹。 javascript 属于单独的文件。它与视图无关。您不应该混合标记和脚本。当您有单独的脚本时,不仅您的动态标记会小得多,而且您还可以利用诸如外部脚本的浏览器缓存、缩小等功能,...您在这部分中会注意到的另一件事是我删除了<script>您在其中引用 jQuery 和 jQuery.validate 脚本的节点。您已经在布局中这样做了,不要重复两次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用无障碍 JQuery 在部分视图中显示错误消息时遇到问题 的相关文章

随机推荐

  • 如何通过Selenium摆脱信息栏“Chrome正在被自动化测试软件控制”

    已经搜索了一段时间并尝试了所有现有的解决方案 但似乎没有一个有效 我创建了一个 幻灯片放映 它将首先登录 然后在选项卡之间交替 所有这些都有效 但我无法摆脱 Chrome 正在被自动化测试软件控制 栏 有什么建议吗 Code from se
  • 如何使用MVVM自动隐藏WPF中的DataGrid列? [复制]

    这个问题在这里已经有答案了 使用 MVVM 无代码隐藏 我想在选择时隐藏我的 DataGrid 列 我有以下代码
  • 如何在 Xcode IDE 中启用垂直分割视图?

    我正在深入研究 iOS 开发 并且在多显示器设置上使用 Xcode 显然 我想利用多个监视器来查看和编辑源代码的多个窗格 但我很难弄清楚如何启用垂直拆分视图 在其他 IDE 中 这只是您在 窗口 菜单中单击的一个选项 如何在 Xcode 中
  • 在用 QtSpim 编译的 MIPS 中生成随机整数

    所以我看到了很多关于使用 MARS 在 MIPS 程序中生成随机整数的问题 系统调用 42没关系 问题是我需要为编译的程序生成一个随机整数QtSpim 它没有 42 或大于 17 的系统调用 我无法弄清楚从系统中获取类似随机值的东西 例如
  • 将值替换为该列的平均值 - 许多列

    我有一个包含超过 1000 列和 11000 行的 Excel 工作表 全部包含数字数据 数据中存在用 表示的缺失值 我想用它所在列的平均值替换所有 值 手动执行此操作需要很长时间 那么是否有一个公式可以实现此目的 非常感谢您的帮助 我可以
  • Apache Spark,向现有 DataFrame 添加“CASE WHEN ... ELSE ...”计算列

    我正在尝试使用 Scala API 将 CASE WHEN ELSE 计算列添加到现有的 DataFrame 中 起始数据框 color Red Green Blue 所需的数据帧 SQL 语法 CASE WHEN color Green
  • 在 flutter 中从父颜色生成自定义色调

    我需要找到一种更好的方法来从给定的自定义颜色生成阴影颜色以用于主题目的 到目前为止 我找到了一种通过降低给定颜色的不透明度来实现此目的的方法 如下所示 所以我可以强调颜色颜色和给定颜色的褪色颜色到此功能 import package flu
  • 如何从主脚本将导入的模块块传输到表面上?

    在我的主文件中 我有一个名为win 我像这样导入一个模块from draw import def draw image x y win blit image x y 这是一个来自draw 它不起作用 因为win没有定义 如何定义它 将目标表
  • ES6导出默认函数

    我可以为每个文件导出多个函数吗 似乎当我这样做时 第二个函数会覆盖第一个函数 例子 在my index js file export default function aFnt console log function a export d
  • Angular 4 - router.url 单元测试

    如何在 Angular 4 单元测试中模拟 router url 我在组件的 ngOninit 中使用 router url 但在我的测试中 router url 的值为 在 Angular v9 中Router url是只读 getter
  • 未找到 Django URL 模式

    我按照教程允许用户注册帐户 但似乎找不到 url 路径 当我设置名称时 它允许我访问 127 0 0 1 8000 accounts signup 但不能访问 127 0 0 1 8000 signup 我尝试将 urlpatterns 从
  • j_spring_security_check HTTP 状态 404(自定义登录)

    我正在使用 Spring 4 Hibernate 4 我检查了每一篇文章 但我无法找出问题所在 Web xml
  • iOS 上有什么好的自定义键盘实现教程吗?

    我需要为区域语言 泰米尔语 制作一个自定义键盘 如果用户按下自定义键盘键 我必须引入泰米尔字体 那可能吗 如果是的话 有可用的教程或资源吗 提前致谢 http cocoacontrols com platforms ios controls
  • R dplyr。过滤包含一列数值向量的数据框

    我有一个数据框 其中一列包含数字向量 我想根据涉及该列的条件过滤行 这是一个简化的示例 df lt data frame id LETTERS 1 3 name c Alice Bob Carol mylist list c 1 2 3 c
  • 使用猫头鹰轮播在触摸设备上滑动时禁用垂直滚动

    我想在移动设备上水平滑动轮播时禁用网页上的垂直滚动 我正在使用猫头鹰旋转木马 我尝试使用 css Overflow hidden 到 html body 但不起作用 尝试了其他解决方案 但它们不起作用 我尝试过的代码在下面 Tried th
  • 日期时间之间的差异

    我这里有一些代码可以计算两个日期时间之间的小时差 这里有点不知所措 代码时好时坏 我不知道为什么 var date tr find td eq 10 input val var time tr find td eq 10 option se
  • 从 doc 和 docx 中提取文本

    我想知道如何阅读 doc 或 docx 的内容 我使用的是 Linux VPS 和 PHP 但如果有使用其他语言的更简单的解决方案 请告诉我 只要它在 Linux 网络服务器下工作即可 在这里我添加了从中获取文本的解决方案 doc docx
  • 包含 13 位数字的字段的正则表达式?

    我需要一个正则表达式来检查字段是否为空或者是否正好是 13 位数字 问候 弗朗西斯 P 尝试这个 另请参阅 rubular com http www rubular com r SYIlg16mHn d 13 解释 是字符串锚点的开头和结尾
  • 在代码中创建 RowDefinitions 和 ColumnDefinitions

    我为Windows Phone开发应用程序 我想创建 2 行 2 列的表 我为此表创建 xaml 代码
  • 使用无障碍 JQuery 在部分视图中显示错误消息时遇到问题

    以下是我在 MVC3 中的区域 Model public class AdminModule Display Name My Name Required public String MyName get set 局部视图 model 1 A