我在这里汇集了一个小例子,只是为了复制这个问题.
我有一个强类型的部分视图_Name.cshtml:
我有一个强类型的部分视图_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.