У меня есть частичный элемент управления с 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/
Javascript AjaxLoadedContentScriptFix.js, кажется, работает нормально для меня.
Это тот ответ, который я искал.
Все остальные советы, такие как использование пользовательской проверки на стороне клиента в AjaxOptions Ajax.BeginForm - c'mon people:)