2010-07-27 2 views
1

Все примеры, которые я могу найти что-то вроде этого:Как реализовать проверку ASP.NET MVC 2, которая проверяет базу данных?

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

Это отлично подходит для простых случаев, но то, что о чем-то, что проверяет на стороне другого сервера базы данных или что-то?

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

Я думаю, что это было бы что-то вроде:

public IEnumerable<string> ValidateUserHasNotAlreadyRatedMovie(User currentUser, Guid movieId) 
{ 
    if(movieHasAlreadyBeenRated) 
    { 
    yield return "Movie been rated man!"; 
    } 
} 

Теперь я назвал бы это что-то вроде:

var errors = new List<string>(); 
errors.AddRange(ValidateUserHasNotAlreadyRatedMovie(topic, comment)); 
if(errors.Any()) 
{ 
    throw new SomeTypeOfCustomExtension??(errors); 
} 

ли мне просто нужно продлить исключение для пользовательского SomeTypeOfCustomExtension выше , или есть что-то уже построенное? Я делаю это путь ASP.NET MVC 2?

После этого, как я могу поместить его в состояние модели и дать представление, что-то не так?

+0

http://www.asp.net/mvc/tutorials/validating-with-a-service- layer - cs, это именно то, о чем я говорил и пытаюсь выполнить! Я знал, что кто-то другой должен иметь аналогичные цели. Всего лишь несколько дней, чтобы найти LOL :) – rball

+0

Вздох, похоже, вы МОЖЕТЕ поместить атрибуты на уровне класса ... это также упростит ситуацию. – rball

+0

Пример атрибутов уровня класса: http://byatool.com/mvc/custom-data-annotations-with-mvc-how-to-check-multiple-properties-at-one-time/ – rball

ответ

1

Посмотреть это может помочь

Удаленная проверка с ASP.NET MVC 2

http://bradwilson.typepad.com/blog/2010/01/remote-validation-with-aspnet-mvc-2.html

+0

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

+0

@ rball: Для записи это, вероятно, лучший способ сделать это. Это позволяет вам сразу же подтвердить, что рейтинг фильма действителен, не требуя полной повторной обработки всей страницы. +1 –

+0

Хорошо, я перечитаю это и попробую. Кажется, это дерьмо! – rball

0

ASP.NET 2.0 MVC способ выполнения пользовательской проверки: described here. В основном это показывает, как написать специальный атрибут проверки. Вот пример одного такого пользовательского атрибута, который проверяет базу данных для имен уникальности:

public class UniqueNameAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     string str = (string)value; 
     if (String.IsNullOrEmpty(str)) 
      return true; 

     using (XDataContext vt = new XDataContext()) 
     { 
      return !(vt.Users.Where(x => x.Username.Equals(str)).Any()); 
     } 
    } 
} 

В ASP.NET 1.0 (способ, который не требует пользовательских атрибутов) является described here.

+0

«ASP.NET 2.0 MVC way», который вы связали, была именно той статьей, которая не объясняет, как это сделать , это сложнее, чем украшать свойство. Путь 1.0 выглядит поближе, но есть класс RuleViolation - это вспомогательный класс, который мы добавим в проект, который позволит нам предоставить более подробную информацию о нарушении правил ». Значит, у них еще нет вспомогательного класса в MVC 2, который делает больше, чем то, что описано в этой статье? Я не использую L2S, поэтому я думаю, что мне придется иметь входную модель dto с свойством IsValid, которое каким-то образом инкапсулирует, если каждый из декораторов свойств и – rball

+0

пользовательская логика. В любом случае, спасибо за ответ, но не ответ, который, я думаю, я искал. Я уже выполнил поиск Google и не нашел ничего полезного. – rball

+0

Первый комментарий на самом деле доходит до этого, а затем ответ, похоже, помогает: public class UniqueNameAttribute: ValidationAttribute { public override bool IsValid (значение объекта) { string str = (string) value; if (String.IsNullOrEmpty (str)) return true; Использование (XDataContext vt = new XDataContext()) { return! (Vt.Users.Where (x => x.Username.Equals (str)). Any()); } } } – rball

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