Нокаут + mvc 3 + Проверка

В контроллере я хотел бы получить доступ к правилам проверки клиента модели. Я добавил некоторые атрибуты, используя аннотации данных, и хотел бы получить возможность передать что-то обратно клиенту с помощью вызова ajax, чтобы я мог автоматически создавать параметры проверки jquery.

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

Без использования отражения на стороне сервера модели я немного не уверен, как это достичь.

Ответ 1

В моем Mvc Controls Toolkit Я разработал помощников, основанных на библиотеке нокаутов. Эти помощники не только помогают писать код нокаута, но и улучшают библиотеку нокаута с помощью ненавязчивой проверки и глобализации. Кроме того, механизм привязки расширен и включает в себя комплексные элементы управления, такие как DatetimePicker и другие "сложные" (созданные разными элементами HTML).

Наконец, шаблоны нокаута можно определить с помощью помощников Razor.

См. документацию здесь, здесь, здесь и здесь. У меня также есть некоторые руководства, которые показывают, как реализовать дополнительные функции с моими помощниками:

Низкие передачи BandWidth с клиентскими сайтами шаблонов Mvc Controls Toolkit

Обработка больших объемов данных с помощью клиентских шаблонов

Обработка больших объемов данных с помощью клиентских шаблонов 2

Ответ 2

В зависимости от того, что вам нужно делать, Breeze js может быть лучшим решением. особенно если вы используете EF, вы можете реплицировать большую часть функциональности сервера EF DbContext на стороне клиента, включая, конечно, проверку, но также и отслеживание изменений .saveChanges, простой синтаксис, который напоминает LINQ, кеширование, сериализация и десериализация, позволяющие работать в автономном режиме и многое другое.

Основные шаги для работы с Breeze js:

  • создать EF-модель на сервере
  • добавьте пакет NuGet на сервер для создания служб веб-API, которые выставляют модель на стороне клиента. Это делается с удивительно низким числом С# кода. Одна из вещей, которые это делает, - это выявление метаданных: определение объектов, отношений и дополнительной информации, таких как данные проверки аннотаций данных.
  • добавить пакет js Nuget для клиентской стороны, который будет использоваться для репликации поведения EF на стороне клиента.

Конечно, не все функции на сервере будут реплицироваться на клиенте, но вы можете многое сделать:

  • создавать новые объекты на стороне клиента
  • делать запросы на стороне клиента, которые будут выполняться на сервере и возвращаться клиенту
  • изменять объекты на клиенте: создавать, изменять, удалять...
  • создавать отношения на стороне клиента: например, создавать новые объекты chlid в родительском объекте
  • вызов saveChanges на стороне клиента, который будет передавать все отслеживаемые изменения на сервер, чтобы обновить бэкэнд
  • Конечно, пока вы это сделаете, вы получите автоматическую проверку клиента, а также дополнительную проверку сервера, когда вы вызываете .saveChanges

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

Ответ 3

Это довольно задача. Вы хотите, чтобы иметь возможность конвертировать ваш код С# в Javascript с соответствующими преобразованиями типов данных и т.д. Вам будет лучше записывать два отдельных набора валидации на стороне сервера и клиента. Было бы намного легче поддерживать это, чем писать собственную платформу конверсии самостоятельно и поддерживать ее

Ответ 4

В модели используйте валидацию атрибутов, которые вам нравятся:

 public class ModelWithValidation
 {
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }
 }

В формах mvc

@using( Html.BeginForm())
{    
     @Html.TextBoxFor(m => m.Name, new {data_bind = "value: name"})
     @Html.ValidationMessageFor(m => m.Name)
}

В jQuery-тесте, если форма действительна вSubmit или в функции сохранения нокаута, вызовите следующий код для проверки ввода. Вы должны включить библиотеки jQuery.unobtrusive * и jQuery.validate *. Не забудьте также проверить ввод на стороне сервера!

var form = $("form");
form.removeData('validator');
form.removeData('unobtrusiveValidation');
$.validator.unobtrusive.parse(form);

$("form").valid() //true false