【发布时间】:2010-11-14 21:42:33
【问题描述】:
我有一个带有Ajax.BeginForm 的部分控件,其中包含带有一个文本框和验证消息的简单表单。模型正在使用数据注释将此字段设置为必填。
当上述部分控件直接使用Html.RenderPartial 加载到视图中时,客户端验证工作正常。
当使用Ajax.ActionLink 加载上述部分控件时,客户端验证停止工作(表单提交时使用空文本框并且服务器端验证工作正常):
Ajax.ActionLink("Create New Job Note", "CreateNew", "JobNotes",
new AjaxOptions { UpdateTargetId = "CreateNewJobNote",
HttpMethod="GET" })
我的母版页上有以下 javascript 的引用:
<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>
<script src="/Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script>
当我使用Ajax.ActionLink 加载部分控件时,为什么客户端验证不起作用?
========== 编辑 ===============
根据要求,这里是相关的代码引用:
1) 我正在使用此代码加载包含文本框的部分控件:
<%:Ajax.ActionLink("Create New Job Note", "CreateNew", "JobNotes", new AjaxOptions { UpdateTargetId = "CreateNewJobNote", HttpMethod="GET" })%>
控制器方法:
public ActionResult CreateNew()
{
return PartialView("JobNotesCreateNew", new NewJobNoteModel());
}
2) JobNotesCreateNew.ascx:
<% Html.EnableClientValidation();%>
<% using (Ajax.BeginForm("CreateNew", "JobNotes", FormMethod.Post, new AjaxOptions { UpdateTargetId = "JobNotes" }, new { id = "CreateNewJobNoteForm" }))
{ %>
<%: Html.ValidationSummary(true, "Please correct errors on the form.")%>
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%: Html.LabelFor(model => model.Note)%>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Note)%>
<%: Html.ValidationMessageFor(model => model.Note)%>
</div>
<p>
<input type="submit" value="Create" />
<%: Ajax.ActionLink("Cancel", "Cancel", "JobNotes", new AjaxOptions { UpdateTargetId = "CreateNewJobNote", HttpMethod = "GET" })%>
</p>
</fieldset>
<% } %>
就是这样。 所以,总结一下:
- 加载了带有指向我的部分控件的 ajax 操作链接的视图。
- 用户点击“创建新的工作记录” 加载我的 ajax 操作链接 部分控制正确。
- 当表格来自 JobNotesCreateNew.ascx 获取 使用“创建”提交 按钮我希望客户端 验证以检查 TextBoxFor 为模型。注不为空。
但是客户端验证并没有发生,表单被发布到服务器。 我可以在萤火虫中看到这一点。 我还可以在 VS 2010 的服务器端调试以下控制器方法:
[HttpPost]
public ActionResult CreateNew(NewJobNoteModel newJobNote)
所以我的问题是:为什么客户端验证被破坏了?
谢谢。
========== 编辑:17/11/2010 ==============
有趣。 我在模型上使用数据注释验证:
public class NewJobNoteModel
{
[Required]
public string Note { get; set; }
}
由于上述验证在使用 Html.BeginForm() 时在客户端工作正常,我假设它也应该在 Ajax.BeginForm() 场景中工作。 我在这里弄错了吗?我真的应该在客户端自己触发验证吗? 我将研究这篇文章,快速浏览了一下,那里的 CompleteFunction 看起来很手动,我希望那里的事情更加自动化。
谢谢!
========== 编辑:25/11/2010 ==============
好的,我在这里找到了解决问题的方法: http://adammcraventech.wordpress.com/2010/06/11/asp-net-mvc2-ajax-executing-dynamically-loaded-javascript/
AjaxLoadedContentScriptFix.js javascript 对我来说似乎工作正常。
这就是我一直在寻找的答案。 所有其他技巧,例如在 Ajax.BeginForm 的 AjaxOptions 中使用自定义客户端验证 - 来吧人们:)
【问题讨论】: