当前位置: 首页 > 知识库问答 >
问题:

ASP。NET MVC5引导3模式表单未验证客户端,正在发回页面

斜烈
2023-03-14

我有一个MVC5应用程序,我刚刚开始对它进行一些Ajax操作。我有一个带有按钮的页面,单击该按钮会打开一个引导模式,其中包含来自另一个操作的表单。但是,当提交该模式表单时,不会调用jquery非干扰性验证,页面会重定向到空白页面上的部分视图,而不是在模式对话框中。

因此,1:如何让jquery验证在模式内部工作,2:如何使表单不刷新页面,而是将返回的视图重新加载到模式中?第三:我对Ajax的使用方式感到困惑。BeginForm应该可以工作,因为我假设它不会创建页面刷新。

这是包含用于加载模式的按钮的页面:

@using Plus.ViewModels
@model UserViewModel
@{
    ViewBag.Title = "Personal Details";
}
@using (Html.BeginForm(null, null, FormMethod.Post, new { @class = "form-horizontal" }))
{
    @Html.AntiForgeryToken()
// A separate form here

<div class="form-actions">
    <button class="btn btn-primary" type="submit">
      <i class="fa fa-save"></i>
       Save
    </button> |

 <a class="btn btn-primary" href="@Url.Action("ChangePassword", "Manage", new object{})" data-toggle="modal" data-target="#myModal">Change Password</a>

</div>
}


<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="false">
    <div class="modal-dialog">
        <div class="modal-content">
        </div>
    </div>
</div>

@section Scripts {
    <script type="text/javascript">
        $('#myModal').on('shown.bs.modal', function () {
            jQuery.validator.unobtrusive.parse($(this));
        })
    </script>   
}

包含要在模式对话框中提交的表单的视图:

@model Plus.ViewModels.ChangePasswordViewModel
@{
    ViewBag.Title = "Change Password";
    Layout = "";

    AjaxOptions options = new AjaxOptions();
    options.HttpMethod = "POST";
    options.Url = Url.Action("ChangePassword", "Manage");
    options.UpdateTargetId = "modalForm";
    options.InsertionMode = InsertionMode.Replace;
}

@using (Ajax.BeginForm("ChangePassword", "Manage", null, options, new { @class = "form-horizontal", role = "form" }))
{
    <div id="modalForm">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
            <h4 class="modal-title" id="myModalLabel">Change Password</h4>
        </div>
        <div class="modal-body">

            @Html.AntiForgeryToken()
            @Html.ValidationSummary("", new { @class = "text-danger" })
            <div class="form-group">
                @Html.LabelFor(m => m.OldPassword, new { @class = "col-md-6 control-label" })
                <div class="col-md-6">
                    @Html.PasswordFor(m => m.OldPassword, new { @class = "form-control" })
                </div>
            </div>
            <div class="form-group">
                @Html.LabelFor(m => m.NewPassword, new { @class = "col-md-6 control-label" })
                <div class="col-md-6">
                    @Html.PasswordFor(m => m.NewPassword, new { @class = "form-control" })
                </div>
            </div>
            <div class="form-group">
                @Html.LabelFor(m => m.ConfirmPassword, new { @class = "col-md-6 control-label" })
                <div class="col-md-6">
                    @Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control" })
                </div>
            </div>

        </div>
        <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
            <button type="submit" class="btn btn-primary">Change Password</button>
        </div>
    </div>
}

操作的控制器:

public ActionResult ChangePassword()
{
    ChangePasswordViewModel cpvm = new ChangePasswordViewModel();
    return PartialView(cpvm);
}

//
// POST: /Manage/ChangePassword
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ChangePassword(ChangePasswordViewModel model)
{
    if (!ModelState.IsValid)
    {
        return PartialView(model);
    }
    var result = await UserManager.ChangePasswordAsync(User.Identity.GetUserId(), model.OldPassword, model.NewPassword);
    if (result.Succeeded)
    {
        return Json(new { success = true });
    }
    // Failed
    AddErrors(result);
    return PartialView(model);
}

共有1个答案

荆城
2023-03-14

第一个问题的答案:-只需将JS文件,即Jquery Unobtrusive JS文件包含在您正在以模态打开的局部视图中,即可正常工作,有时此问题在asp的局部视图中出现。net mvc。

只需在局部视图中包含此js文件:

<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

或者在局部视图中尝试此操作:

$.validator.unobtrusive.parse($("form"));

第二个和第三个问题的答案:-正如我在你的问题中看到的,你已经在使用Ajax了。BeginForm()因此在提交表单时不应重新加载页面。。。只需检查是否包含jquery。低调的ajax。是否为min.js文件。

并在web中添加以下代码。配置文件:

<appSettings>
  <add key="ClientValidationEnabled" value="true" />
  <add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
 类似资料:
  • 我对Angular很陌生,我正在尝试使用Angular和Bootstrap 4创建一个注册表单。 我想要的结果是使用Bootstrap的样式和Angular的验证。更准确地说,在验证表单时,Angular在两个不同的地方应用样式(ng-valid、ng-invalid等):input元素和form元素。 我使用的是反应形式,我想避免这样的事情(未测试): 有没有一个简单的方法(不是太冗长)来实现这

  • 问题内容: 我试图了解如何执行以下操作: 声明表单的可接受方式是什么。我的理解是,您只需用HTML声明表单,并添加ng-model指令,如下所示: 要发送到服务器的内容。我可以将item对象作为JSON发送到服务器,然后对其进行解释。然后,我可以对对象执行验证。如果失败,则抛出JSON错误,然后发回确切的信息?有接受的方式吗?如何以一种很好的方式将验证错误从服务器推送到客户端? 我确实需要一个示例

  • 我试图了解如何做以下事情: 声明表单的公认方式是什么。我的理解是您只需用超文本标记语言声明表单,然后添加ng-model指令,如下所示: 发送到服务器的内容。我可以将item对象作为JSON发送到服务器,并对其进行解释。然后我可以对对象执行验证。如果失败,我抛出一个JSON错误,并返回具体内容?有没有公认的方法?如何以一种好的方式将验证错误从服务器推送到客户端? 我真的需要一个例子,但是Angul

  • 因此,为了实现这个逻辑,我认为我需要在客户端验证JWT令牌。Q1,这是一个明智的做法吗。 Q2,我正在使用的库似乎需要一个公钥才能使用它的函数。我似乎没有公钥,只有一个秘密,这是我刚刚编造的,所以它不是用一对生成的。我的公钥从何而来,或者是否有另一种方法来验证我的令牌而不使用此方法? 这一切似乎应该是显而易见的,我错过了一些东西,所以很抱歉,如果这是一个愚蠢的问题,但我似乎找不到答案?

  • 问题内容: 我想为绑定JAXB的消息关闭模式验证。我正在处理客户端CXF代码(第一代WSDL)。我尝试使用 没有成功(请参阅参考CXF FAQ )。我很难找到设置此属性的编程方式。我还探讨了使CXF短路并访问解析器,解组器等的方法。 谢谢你的帮助。 问题答案: 要关闭模式验证,您应该将属性设置为。 根据您转介的文档(CXF FAQ)。 启用模式验证(将根据模式验证所有请求和响应) 要禁用架构验证(

  • 我有以下用于javascript密码验证的正则表达式: 正则表达式规则是: 12-25个字符 至少有一个大写字母 至少有一个小写字母 至少有一个数字 至少有一个特殊字符:!#$%()*,-./:;=?@[]^ `{124;}~ 然而,正则表达式似乎不起作用。它匹配任何字符。我该怎么解决这个问题?