Показать / скрыть бланк, не отправляющий форму с проверкой на стороне клиента и атрибутами - PullRequest
0 голосов
/ 15 декабря 2011

У меня есть приложение ASP.NET MVC 3.0. Внутри приложения у меня есть вид входа в систему, который строго типизирован через класс LoginViewModel. Кроме того, к представлению входа в систему могут обращаться два разных типа людей Employees and Management.

Вид отображается в виде < table >. Пользователь должен сначала выбрать (из 2 переключателей), какой тип пользователя он (Employee or Management), и из этого выбора я изменяю пользовательский интерфейс и отображаю (показываю / скрываю) определенные div с.

Если выбрано Employee, я запрашиваю Employee Number и Password.

Если выбрано Management, я запрашиваю UserCode и Password.

LoginViewModel имеет 4 свойства:

  • - UserType (представляет выбранный переключатель)
  • - EmployeeNumber (представляет текстовое поле для сотрудников)
  • - UserCode (представляет текстовое поле для управления)
  • - Password (представляет текстовое поле для пароля независимо от того, кто выбран)

Поскольку пользовательский интерфейс изменяется в соответствии с выбранным переключателем, я не могу использовать атрибут [Required] в свойствах EmployeeNumber и UserCode, потому что если я это сделаю, < form > не будет отправлено (так как одно из полей будет скрытый).

Чтобы преодолеть это ограничение / проблему, я должен удалить атрибут [Required] в обоих свойствах и предположительно сделать это на стороне клиента.

Для записи я не использую MicrosoftMVCValidation.js, но вместо этого jquery.validate.min.js and jquery.validate.unobtrusive.js

Вопрос 1)

При поиске примеров в Интернете я видел многие из них, включая этот файл:

JQuery. ненавязчивый -ajax.min.js

Какова цель этого файла и как он соотносится с проверкой на стороне клиента (если есть)? Мне действительно это нужно? Разве jquery.validate.min.js и jquery.validate.unobtrusive.js должно быть недостаточно?

Вопрос 2)

Я понимаю, что можно написать собственный атрибут валидации и поместить его в свойство EmployeeNumber или UserCode, но если я это сделаю (и зная, что буду скрывать один из них в пользовательском интерфейсе), как я могу помешать себе получить та же проблема, что у меня была с атрибутом [Required]? (имеется ввиду невозможность отправить форму, потому что она скрыта)

Могу ли я просто сделать это прямо в представлении? Кто-нибудь будет так любезен, чтобы показать мне быстрый пример?

Спасибо

Да, да ... jquery-1.7.1.min.js включен в основной макет (на случай, если кто-нибудь спросит).

Ответы [ 4 ]

1 голос
/ 15 декабря 2011

Есть несколько способов справиться с этим.

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

тогда это будет выглядеть так.

public class MyModel {
     public bool IsManager { get; set; }

     [ConditionalRequired("IsManager", false)] // validates if IsManager is false
     public int? EmployeeNumber { get; set; }

     [ConditionalRequired("IsManager", true)] // validates if IsManager is True
     public string UserCode { get; set; }
{

Что касается создания этого атрибута, вы можете начать с атрибута, описанного здесь http://www.devtrends.co.uk/blog/the-complete-guide-to-validation-in-asp.net-mvc-3-part-2

Еще один способ сделать это - использовать Свободная проверка и снова выполнить проверку на основе значения вашего флажка.

Другой способ - отключить проверку и проверить ее в своей модели.

0 голосов
/ 16 декабря 2011

Вывод:

После прочтения разных мнений Оливхора, Юрия и Мистера Мана я пришел к следующему выводу:

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

Я решил следовать подходу olivehour и создать составной / родительский ViewModel, который будет содержать две модели ViewModel (одну для Employee и одну для Management). Каждый из них будет иметь определение формы и соответствующие [Атрибуты].

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

Обратите внимание, что принятый ответ был прованским, потому что я решил изменить свой подход, но я настоятельно рекомендую людям (если кто-то даже читает это) перейти по ссылке Mystere Man в полном руководстве по валидации.

Часть 1 и Часть 2 должны быть прочитаны для всех!

Если бы я не решил изменить свой подход, я бы пошел с решением Mystere Man.

Спасибо

0 голосов
/ 15 декабря 2011

Чтобы ответить на ваш первый вопрос, jquery.unobtrusive-ajax.min.js не для ненавязчивой проверки. Он предназначен для использования вспомогательного средства @Ajax html (@ Ajax.Form и т. Д.).

Чтобы ответить на ваш второй вопрос, я бы на самом деле создал 2 совершенно разные модели представления и соответствующие формы для этого. Когда пользователь выбирает с помощью переключателя, показывать правильную форму. Это означает, что не объединяйте Employee и Management в один LoginViewModel. Затем вы можете рассматривать валидацию, а также другую логику представления отдельно между ними.

Обновление

Чтобы ответить на ваш вопрос о строгой типизации, вы должны создать 2 разных (частичных) представления. Один из них будет иметь @model EmployeeLoginViewModel, а другой - @model ManagementLoginViewModel. Чтобы отобразить их на одной странице, есть несколько разных подходов. Вы можете иметь один LoginViewModel, который содержит экземпляр каждого из ManagementLoginViewModel и EmployeeLoginViewModel, а затем использовать @ Html.EditorFor (m => m.Employee) и @ Html.EditorFor (m => m.Management). Однако этот подход работает, только если ваши частичные представления находятся в папке EditorTemplates.

Другой подход заключается в использовании @ Html.Action () и двух различных методов действия контроллера для возврата частичных представлений.

0 голосов
/ 15 декабря 2011

Вам не нужно удалять RequiredAttribute.Вместо этого имейте оба свойства как виртуальные в LoginViewModel.Затем имейте модель Employee и модель Management, которые переопределяют соответствующие свойства и задайте RequiredAttribute по мере необходимости.Вы все еще можете использовать то же действие, а затем внутри него, основываясь на выборе, использовать UpdateModel, чтобы заполнить соответствующий тип модели.Это не даст вам проверки на этих полях на стороне клиента, но вы можете справиться с этим с помощью javascript, и сторона сервера будет обрабатываться для вас нормально.

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