перед загрузкой mvc3 проанализируйте все расширения html-помощника на странице - PullRequest
0 голосов
/ 17 июня 2011

Я написал несколько методов расширения, которые расширяют вспомогательный класс html для проверки формы на стороне клиента. То, что я хотел бы сделать, это загрузить страницу массивом (javascript) всех моих элементов, которые являются частью моей проверочной «библиотеки».

пример:

@Html.VTextBox("blah)
@Html.VDropDownList("bling")
@Html.VTextBox("bloo")

когда страница загружена, я бы хотел, чтобы массив javascript был помещен вверху, заполненный чем-то вроде этого:

errorListArr = new Array("blah","bling","bloo");

В настоящее время я использую errorListArr.push () для каждого элемента и каждый раз записываю теги сценария ... явно не самый элегантный способ сделать это. Я также хотел бы выяснить, как я могу заранее проанализировать всю страницу, чтобы я мог собрать свой список элементов, которые мне понадобятся для проверки серверной части.

Пожалуйста, дайте мне знать, если это можно сделать, и любой фрагмент кода / примеры будут оценены.

Ответы [ 2 ]

1 голос
/ 17 июня 2011

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

Прежде всего, проверка на стороне сервера в MVC 3 - этообычно выполняется как ответная реакция на действие, которое берет модель и проверяет ее.Если модель недопустима, вы возвращаете представление с моделью (теперь проверенной), и представление будет отображать соответствующие сообщения об ошибках для свойств, которые были неправильными.

По умолчанию вы можете определить, чтопроверка, выполняемая путем добавления определенных атрибутов к свойствам модели, для которой вы отображаете входные данные.

Более того, MVC достаточно умен, чтобы выводить клиентский javascript для выполнения многих из этих проверок, когда пользователь пытается отправить форму, фактически не требуя обратной отправки!

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

В MVC 3 у вас также есть возможность включить проверка "ненавязчивого JavaScript" ,который в основном выполняет ту же проверку на стороне клиента, что и обычно, но вместо генерации набора встроенного javascript он просто помечает входные элементы определенными атрибутами «data-».Несколько библиотек на основе jquery затем сканируют страницу на наличие элементов с этими флагами и добавляют к ним соответствующие обработчики проверки.

Если у вас есть потребности в проверке, выходящие за рамки того, что MVC предлагает из коробки, этолегко добавить свои собственные атрибуты проверки или даже заставить вашу модель выполнять собственную логику для проверки себя.

Вообще говоря, если вы обнаружите, что визуализируете много маленьких фрагментов JavaScript на стороне клиента, вы можете захотетьчтобы следовать шаблону «ненавязчивый javascript» самостоятельно:

  1. Поместите код в статический файл javascript, который знает, как сканировать DOM на предмет определенных флагов, которые его интересуют.
  2. Визуализируйте свой HTMLэлементы с добавленными этими флагами, используя атрибуты «data-» для добавления специфики, где это необходимо.
0 голосов
/ 21 июня 2011

Ваша "библиотека валидации", вероятно, не содержит так много методов расширения.Так что было бы не так уж не элегантно размещать в каждой из них одну и ту же строку кода, чтобы добавить имя обработанного элемента в ваш массив.

Другой способ - это сделать искусственно что-то общее для всех проверенных элементов, спасибок вашей «библиотеке валидации»: общий интерфейс маркера.Идея такова: не используйте элементы в качестве экземпляров их реальных типов.Вместо этого создайте подтипы этих типов, которые также реализуют интерфейс IValidated только с одним членом string ID (я предполагаю, что все интересующие вас элементы уже имеют такое свойство благодаря оригинальному классу, экземплярами которого они являются),Затем, после того, как вы сделали все, что вам нужно, вы строите свой массив только один раз в качестве завершающего действия перед отправкой страницы клиенту.Теперь, когда все ваши проверенные пользователем элементы распознаваемы благодаря IValidated, с такой однострочностью это довольно просто:

errorListArr = new Array(this.Page.SubControls().OfType<IValidated>().Select(elt => elt.ID));

SubControls - очень удобный метод расширения для получения всех субконтролей.независимо от их глубины в дереве элементов управления:

public static IEnumerable<Control> Subcontrols<T>(this T parentControl) where T : Control
{
    //Recursively returns all the parentContol's descendant controls 
    foreach (Control ctrl in parentControl.Controls)
    {
        yield return ctrl;
        foreach (Control childCtrl in ctrl.Subcontrols())
        {
            yield return childCtrl;
        }
    }
}

Конечно, вам, возможно, придется внести несколько изменений, чтобы удовлетворить ваши точные потребности, но это очень важно для идеи.

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

...