2009-05-02 5 views
1

Я не знаю, задали ли люди этот вопрос или они не видели эту проблему или что-то еще.Проверка формы MVC Asp.net Связанная

Я создаю Строчный тип вида для каждого представления Create.

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

Добавляя функции Как

public IEnumerable<RuleViolation> GetRuleViolations() 
    { 
     if (String.IsNullOrEmpty(Name)) 
      yield return new RuleViolation("Name is Required", "Name"); 
     if (String.IsNullOrEmpty(Date.ToString())) 
      yield return new RuleViolation("Date is Required", "Date"); 
     yield break; 
    } 

Мой контроллер действий структурирован как alt text http://www.scottgu.com/blogposts/mvcpreview5/step15.png

Проблема:

Если Имя поля Длина VARCHAR2 (10), и пользователь вводит имя превышено этот предел, тогда объект product (see image) будет иметь имя как Пустой строка.

Больше, чем другие Проблемы такие же, как и выше, например date Если пользователь не вводит дату, то и объект будет иметь дату, например, 1/1/0001.

Резюме: Следует ли использовать этот метод? Или использовать метод, например, получить все элементы с помощью FormColletion или Request.Form ...

Куда вы дадите мне лучшее предложение?

Также см Justin_etheredge's post

ответ

1

Есть много возможных решений этой проблемы.

  • Для строк: Я использую валидатор, которые используют отражение, чтобы получить максимальные длины строк из столбца атрибутов свойств сущностей LINQ и проверить их. В качестве альтернативы вы можете обработать ошибку, возникающую при вставке, если столбец будет усечен.

  • Для дат: вы можете сделать проверку работоспособности на дату (то есть должно быть после некоторой разумной даты), которая должна быть введена пользователем или для дат, которые могут быть автоматизированы, использовать базу данных, созданную по умолчанию, и пометить свойство автогенерируется и доступно только для чтения в дизайнере. Не помещайте эти даты в форму, чтобы они не были установлены в сущности при публикации страницы. Это работает для «Создать дату» и т. Д. Для дат модификации выполните что-то подобное, но при создании обновления вместо триггера обновления вместо значения по умолчанию при обновлении.

  • Для булевых (по умолчанию для false): проверка поставщика значения имеет попытку для поля в дополнение к выполнению проверки на самом сущности. Кроме того, вы можете сделать столбец «nullable» и проверить, что он не является нулевым. Оба являются компромиссами, но последнее делает модель данных подходящей для рамки проверки, поэтому я предпочитаю первую.

1

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

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

В идеале вы хотите создать уровень абстракции между вашими контроллерами и вашей фактической логикой.

Я буду видеть, если я могу получить пример вверх в ближайшее время (что-то придумать на данный момент ...)

+0

Если мы не используем класс LinqToSql то насчет MS Entity Framework? Я не знаю об этой проблеме на MS EF ... Позвольте мне проверить это – Vikas

+0

Да, Microsoft Entity Framework У этой проблемы нет строки, но на дату, как вы сказали, я могу проверить ее в My funtion с именем GetRuleViolation() , Что вы говорите об этом? Прямо сейчас я собираюсь завершить свой демонстрационный проект. Так что я должен изменить свою LINQtoSQL на инфраструктуру Entity? Это будет опасно? Или я могу ввести логический уровень, как вы сказали? Если это так, вы можете уточнить его, чтобы он помог мне создать базовую основу для проектов MVC. – Vikas

Смежные вопросы