【问题标题】:Ajax.BeginForm not working with Html.ValidationSummaryAjax.BeginForm 不适用于 Html.ValidationSummary
【发布时间】:2013-07-24 12:40:03
【问题描述】:

我正在尝试使用 Ajax.BeginForm 将数据发布到控制器。如果出现特定错误,表单应重新呈现并显示添加到 ModelState 的自定义错误消息。由于某种原因,错误消息未显示。我什至正在尝试以下不起作用的测试用例,我错过了什么吗?

Edit.cshtml:
@using (Ajax.BeginForm("Edit", "UserInformation", FormMethod.Post, new AjaxOptions { HttpMethod = "Post", InsertionMode = InsertionMode.Replace, UpdateTargetId = "divFormContainerMain", LoadingElementId = "divPreLoader", OnSuccess = "onSuccess" }))
{
    <div id="divPreLoader" style="display:none; text-align: center"><img src="@Url.Content("~/Content/images/preLoader.gif")" alt="" /></div>
    <div id="divFormContainerMain">
        @Html.Partial("_EditPartialView", Model)
    </div>
    <div class="buttonContainerBottom">
        <span class="buttonContainerInner">
            <input type="submit" id="btnSave" name="buttonPress" value="save" class="orangeButton" />
        </span>
    </div>
}


_EditPartialView.cshtml:
@Html.ValidationSummary(false)
<div id="divFormContainerUserInformation" class="formContainer">
    <div class="labelContainer">
        @Html.LabelFor(m => m.UserName)
    </div>
    <div class="elementContainer">
        @Html.TextBoxFor(m => m.UserName, new { style = "width: 200px" })
        @Html.ValidationMessageFor(m => m.UserName)
    </div>
    <div class="labelContainer">
        @Html.LabelFor(m => m.Name)
    </div>
    <div class="elementContainer">
        @Html.TextBoxFor(m => m.Name, new { style = "width: 200px" })
        @Html.ValidationMessageFor(m => m.Name)
    </div>
    <div class="labelContainer">
        @Html.LabelFor(m => m.EmailAddress)
    </div>
    <div class="elementContainer">
        @Html.TextBoxFor(m => m.EmailAddress, new { style = "width: 200px" })
        @Html.ValidationMessageFor(m => m.EmailAddress)
    </div>
    .
    .
    .
    .
    .
    .
</div>

UserController:
[HttpPost]
public ActionResult Edit(UserModel userModel)
{
    ModelState.AddModelError("", "This is a test");
    return PartialView("_EditPartialView", userModel);
}

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 asp.net-ajax


    【解决方案1】:

    您的脚本添加到了哪里?在 _layout.cshtml 中还是在视图本身中?你是如何加载视图的?是否有显示部分视图的 ajax 请求?

    如果您是通过 ajax 或作为局部视图加载局部视图,则可能是局部视图尚未加载到 jquery DOM 模型树中。

    我会尝试以下方法。改变

    <div id="divFormContainerMain">
        @Html.Partial("_EditPartialView", Model)
    </div>
    

    <div id="divFormContainerMain">
        @Html.Partial("_EditPartialView", Model)
        <script src="/Scripts/jquery.validate.min.js" type="text/javascript"></script>
        <script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>
    </div>
    

    <div id="divFormContainerMain">
        @Html.Partial("_EditPartialView", Model)
        @Scripts.Render("~/bundles/jqueryval") //if you have a bundle for it
    </div>
    

    无论如何,我的建议是仅在需要时才加载验证和不显眼的脚本,而不是在 _layout.cshtml 页面中。

    另外不要忘记在 web.config 中启用以下 appSettings

        <add key="ClientValidationEnabled" value="true" />
        <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    

    【讨论】:

    • +1 表示 web.config 建议 - 这正是我所缺少的!
    【解决方案2】:

    确保您已在 jquery 本身之后将 jquery.unobtrusive-ajax.js 脚本包含到您的视图中。否则 Ajax.BeginForm 助手不会做你认为它做的事:

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

    【讨论】:

    • 这里是脚本条目:
    • 我看不到 jquery.unobtrusive-ajax.js 被包含在任何地方。这就是为什么您的代码可能无法按照我的回答中的说明工作的原因。确保你也包含了这个脚本。
    • 对不起:
    • 您的脚本包含现在看起来不错。你的控制器动作被击中了吗?你在 Firebug 中看到了什么?你能看到正在发送的 AJAX 请求吗?服务器对此请求有何响应?
    • 在我的调试器中,我在调用 PartialView 时设置了一个断点,我可以看到行开始到达。
    猜你喜欢
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2014-06-20
    • 1970-01-01
    相关资源
    最近更新 更多