【发布时间】:2011-06-24 09:20:18
【问题描述】:
我在这里整理了一个小例子来复制这个问题。 我有一个强类型的局部视图_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。
【问题讨论】:
标签: validation asp.net-mvc-3 razor partial csh