Как я могу динамически добавить пользовательскую проверку клиента в Asp.Net Mvc 3? - PullRequest
0 голосов
/ 15 марта 2012

Я хочу иметь возможность динамически добавлять ModelClientValidationRule изнутри действия контроллера.

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

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

public ActionResult DoSomething(){
    ModelState["SomePropertyKey"].Errors.Add( ... )
}

Я ищу секретный соус, который сделает это:

public ActionResult RenderSomething(){
    if(IsSomeCondition){
        <<Secret Sauce To Render the View with "X" ModelClientValidationRule>>
    }
}

IЯ могу изо всех сил и полностью обойти фреймворк, но я предпочитаю как можно больше работать с ним.

Пожалуйста, помогите.

Ответы [ 3 ]

2 голосов
/ 15 марта 2012

Требуется ли, чтобы это было внутри действия контроллера? Если нет, то одним из вариантов будет реализация вашего собственного ModelValidatorProvider.

public class DynamicModelValidatorProvider : ModelValidatorProvider
{
    public IEnumerable<ModelValidator> GetValidators(
        ModelMetadata metadata,
        ControllerContext context)
    {
        // do your logic here, based off metadata or controllercontext.
        // you could return common DataAnnotation type validators
        return new RequiredAttributeAdapter(metadata, context, new RequiredAttribute());

        // or maybe your own custom validator?
    }
}

и в вашем global.asax

ModelValidatorProviders.Providers.Add(new DynamicModelValidatorProvider());

Если вас совсем не интересуют вещи на стороне сервера, реализуйте свой собственный ModelValidator, который имеет надежный метод GetClientValidationRules(), но всегда возвращает успех для Validate()

0 голосов
/ 15 марта 2012

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

Вы также можете написать пользовательские проверки для расширения jQuery-validate, чтобы ваш клиент мог делать это вместо сервера.

Если вы спрашиваете, как применить бизнес-правило глобально, вы можете посмотреть на созданиеваш собственный базовый контроллер, который реализует OnActionExecuting или один из полудюжины методов в жизненном цикле рендеринга представления.или внедрите атрибут ActionFilterAttribute, который делает более или менее то же самое, но дает большую гибкость.

Если вы пытаетесь сделать что-то подобное, запретить пользователю из компании A выполнять действия с данными компании B, вы можете написатьActionFilterAttribute или вы можете сделать это на более низком уровне, написав HttpModule, который находится в конвейере и никогда не позволяет этому происходить независимо от того, что происходит в вашем веб-приложении. Также, если вы используете только хранимые процедуры для редактирования данных, вы можете реализовать этот видчто касается базы данных.

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

0 голосов
/ 15 марта 2012

Я не уверен, что понимаю ваш вопрос, так как ваш второй фрагмент кода - это явно код на стороне сервера, а вы говорите о каком-то клиентском способе достижения чего-либо. Почему бы вам не добавить ошибку в ModelState в зависимости от вашего состояния? Или, может быть, вы могли бы уточнить ваш вопрос, чтобы помочь мне понять ваши потребности.

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