проверка на стороне клиента завершается неудачно, когда частичное управление загружается с использованием Ajax.ActionLink - PullRequest
0 голосов
/ 15 ноября 2010

У меня есть частичный элемент управления с 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>

<% } %>

Вот и все. Итак, подведем итог:

  1. загружается представление с ссылкой действия ajax на мой частичный контроль.
  2. Пользователь нажимает «Создать новую заметку о работе» ссылка действия ajax, которая загружает мой частичный контроль правильно.
  3. Когда форма из 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:)

Ответы [ 2 ]

1 голос
/ 15 ноября 2010

@ Maciek Мне нужно увидеть больше вашего кода, чтобы поставить правильный диагноз.Тем не менее, есть несколько вещей, которые приходят на ум.

  • Во-первых, вы можете использовать одну из AjaxOptions в своей функции для вызова Javascript OnSuccess или OnBegin - вы используете его как эту новую AjaxOptions {OnBegin = "YourJavascriptFunction"}.В частности, ваш процесс будет выглядеть примерно так:

Ajax.ActionLink ("Создать новую заметку о работе", "CreateNew", "JobNotes", новые AjaxOptions {UpdateTargetId = "CreateNewJobNote",OnBegin = "YourJavascriptFunction", HttpMethod = "Post"})

  • Во-вторых, я заметил, что вы не используете действие после публикации.Есть ли причина, почему?Обычно вы хотите выполнить публикацию, а не получить, когда отправляете форму обратно.Если бы я был тобой, я бы это изменил.Я изменил его в сегменте кода, который я разместил выше.

  • В-третьих, вы должны убедиться, что ваша функция JavaScript не вызывает элементы управления, которые еще не существуют.

Это, конечно, некоторые основные вещи, которые нужно проверить.Однако, если вам нужна дополнительная помощь, вы должны опубликовать всю свою страницу, чтобы я мог видеть код и видеть ваши функции JavaScript и то, как вы организовали свою страницу.

Удачи вам!

// ********************************** // ОБНОВЛЕНО 11/16/2010 // ************************************************* //

Привет Maciek,

Iпосмотрел на новый код, который вы разместили в своем вопросе, и я заметил несколько вещей.Во-первых, я не вижу ваш код для проверки текстового поля.Если вы хотите, чтобы система проверила ваше текстовое поле перед обратной передачей Ajax, вам нужно ввести код, чтобы система сделала это.Вам нужна функция JavaScript, которая вызывается с использованием параметра AjaxOption, как я указал в своем первом ответе.Эта проверка не происходит автоматически.

Посмотрите на эту статью, чтобы вы могли узнать, как делать то, что вы пытаетесь сделать.

текст ссылки

Как только вы введете правильный код для проверки, вы сможете проверить свои данные на стороне клиента.В качестве примечания я хотел бы добавить, что вы ДОЛЖНЫ УБЕДИТЬСЯ, что ваш процесс также проверяется на сервере.Пользователь может отключить JavaScript, и если ваш код не выполняет соответствующие проверки на сервере, у вас возникнут проблемы.

0 голосов
/ 25 ноября 2010

, как упоминалось в оригинальном сообщении, вот решение: http://adammcraventech.wordpress.com/2010/06/11/asp-net-mvc2-ajax-executing-dynamically-loaded-javascript/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...