MVC 3 Razor @ Html.ValidationMessage不通过jquery.load()部分加载工作

前端之家收集整理的这篇文章主要介绍了MVC 3 Razor @ Html.ValidationMessage不通过jquery.load()部分加载工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在这里汇集了一个小例子,只是为了复制这个问题.
我有一个强类型的部分视图_Name.cshtml:
@model ValidationInPartial.viewmodels.Myviewmodel

<h2>@ViewBag.Message</h2>

    <fieldset>
        <legend>Name</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.MyName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.MyName)
            @Html.ValidationMessageFor(model => model.MyName)
        </div>

        <a href="#" id="reload">Reload Name</a>

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

<script type="text/javascript">
    $(document).ready(function () {
        $("#reload").click(function () {
            $("#divName").load("Home/NameReload");
        });
    });
</script>

最初加载并显示在主要的Index.cshtml内

<div id="divForm">
    @using (Html.BeginForm()) {

        <div id="divName">
            @Html.Partial("_Name")
        </div>
    }
</div>

字段MyName是必需的,验证是通过Myviewmodel中的required属性来实现的

namespace ValidationInPartial.viewmodels
{
    public class Myviewmodel
    {
        [required(ErrorMessage = "Please enter a Name.")]
        public string MyName { get; set; }
    }
}

第一次加载页面后,如果单击创建按钮,将该字段留空,验证消息“请输入名称”.显示在场外,场地本身变成粉红色,这是预期的行为.
现在通过点击“重新加载名称链接,这是一个ajax调用(jquery.load(…)),部分被重新加载,这里是控制器代码

public PartialViewResult NameReload()
{
    Myviewmodel myviewmodel = new Myviewmodel();
    ViewBag.Message = "Name Reloaded";
    return PartialView("_Name",myviewmodel);
}

这一次,如果您单击创建按钮将该字段留空,则验证消息不会显示在字段旁边,尽管该字段变为粉红色.
事实证明,当重新加载部分时,@ Html.ValidationMessageFor不会首次呈现验证消息.

这是我使用的jquery文件

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.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.min.js")" type="text/javascript"></script>

我不知道这是否是Razor引擎呈现@ Html.ValidationMessageFor的方式的错误,或者是jquery的问题?
任何想法为什么会发生这种情况?

我也读过某个地方,ajax调用失去了该页面的所有脚本,实际上我必须保留部分内的任何JavaScript代码,以便再次渲染和使用它.

在此期间,我发现一个解决方法是手动渲染部分,由@ Html.ValidationMessageFor应该呈现的是:

<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="MyName"></span>

但是,这种解决方法意味着如果我们在viewmodel中更改required属性中的验证类型或验证消息,则需要在视图中修改这个硬编码的html.

解决方法

@NickBork在这里有一个很好的答案.关键是ASP.NET的MVC渲染引擎不会输出验证脚本,如果它不认为有一个表单.这个例子给了他们买的一个表单,然后选择一个内部的HTML从was被返回,基本上抛出了外表的外包装.

还有另一种方法,您只需获取您的观点:

ViewContext.FormContext = new FormContext();

使用这种方法,实际上不会有FORM代码输出,但验证标记将在那里.

谢谢,约翰

猜你在找的HTML相关文章