2010-10-06 3 views
0

Im используя дозвуковой 2.2Дозвуковые - Где я включить мою Busines логику или пользовательскую проверку

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

В основном я обычно включаю проверку на уровне страницы или в моем коде для моих пользовательских элементов управления или страниц aspx. Однако я видел некоторые небольшие сведения об информации, которые могут быть сделаны в рамках частичных классов, генерируемых из дозвуковых.

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

Любая информация очень ценится.

ответ

1

Сначала вы должны создать частичный класс для объекта DAL, который вы хотите использовать. В моем проекте у меня есть папка Generated, где живут сгенерированные классы, и у меня есть другая папка Extended.

Предположим, у вас есть порожденный подзонами класс Product. Создайте новый файл Product.cs в своей расширенной (или любой другой) папке, создайте частичный класс Product и убедитесь, что пространство имен совпадает с пространством имен, порожденных выпущенными классами.

namespace Your.Namespace.DAL 
{ 
    public partial class Product 
    { 
    } 
} 

Теперь у вас есть возможность расширить класс продукта. Интересная часть состоит в том, что дозвук предлагает некоторые методы для переопределения.

namespace Your.Namespace.DAL 
{ 
    public partial class Product 
    { 

     public override bool Validate() 
     { 

      ValidateColumnSettings(); 

      if (string.IsNullOrEmpty(this.ProductName)) 
       this.Errors.Add("ProductName cannot be empty"); 

      return Errors.Count == 0; 
     } 

     // another way 
     protected override void BeforeValidate() 
     { 
      if (string.IsNullOrEmpty(this.ProductName)) 
       throw new Exception("ProductName cannot be empty"); 
     } 

     protected override void BeforeInsert() 
     { 
      this.ProductUUID = Guid.NewGuid().ToString(); 
     } 

     protected override void BeforeUpdate() 
     { 
      this.Total = this.Net + this.Tax; 
     } 

     protected override void AfterCommit() 
     { 
      DB.Update<ProductSales>() 
        .Set(ProductSales.ProductName).EqualTo(this.ProductName) 
        .Where(ProductSales.ProductId).IsEqualTo(this.ProductId) 
        .Execute(); 
     } 

    } 
} 
0

Спасибо за ответ, но вы можете подтвердить это для меня, как им Alittle запутаться, если ваша проверка колонки (ProductName) значение в пределах Validate() или beforevalidate() является строка пуста или NULL, не делает это означает, что вставка/обновление уже было предпринято, поскольку в противном случае он не знал бы, что вы пытались вставить или обновить нулевое значение из полей UI/aspx на странице в столбец ??

Кроме того, при вставке или обновлении событий asp.net мы используем e.cancel = true, чтобы остановить обновление вставки, если недостоверные ошибки автоматически останавливают действие для вставки или обновления?

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

Я думаю, им-Alittle спутать в lifecyle для этих методов и, когда они вступают в игру

+0

Я добавил еще одно сообщение с более подробными пояснениями –

1

В ответ на вопрос Дэна:

Во-первых, посмотрите здесь: http://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/ActiveRecord/ActiveRecord.cs

В этом файле живет вся логика, которую я показал в своем другом посте.

  • Подтверждение: вызывается во время Save(), если Validate() возвращает false, генерируется исключение. Get-х вызывается только если свойство ValidateWhenSaving (который является константой, так что вы должны перекомпилировать SubSonic, чтобы изменить его) истинно (по умолчанию)

  • BeforeValidate: Вызывается во время Сохранить(), когда ValidateWhenSaving верно. Ничего не делает по умолчанию

  • BeforeInsert: вызывается во время сохранения(), если запись является новой. По умолчанию ничего не делает.

  • BeforeUpdate: вызывается во время сохранения(), если запись является новой. По умолчанию ничего не делает.

  • AfterCommit: вызывается после успешного ввода/обновления записи. По умолчанию ничего не делает.

В моей Validate() Я, например, сначала давайте ValidatColumnSettings по умолчанию() метод прогона, который добавит ошибки как «Максимальная строка длина превышена для столбца ProductName», если название продукта больше, чем значение, определенное в база данных. Затем я добавляю еще одну ошибку, если ProductName пуст и возвращает false, если общее число ошибок больше нуля.

Это вызовет исключение во время сохранения(), чтобы вы не смогли сохранить запись в БД.

Я бы предложил вам вызвать Validate() самостоятельно, и если он вернет false, вы увидите элементы this.Errors в нижней части страницы (простой способ) или (более элегантный) вы создаете Dictionary<string, string>, где ключ это имя столбца и значение.

private Dictionary<string, string> CustomErrors = new Dictionary<string, string> 
    protected override bool Validate() 
    { 

     this.CustomErrors.Clear(); 
     ValidateColumnSettings(); 

     if (string.IsNullOrEmpty(this.ProductName)) 
      this.CustomErrors.Add(this.Columns.ProductName, "cannot be empty"); 

     if (this.UnitPrice < 0) 
      this.CustomErrors.Add(this.Columns.UnitPrice, "has to be 0 or bigger"); 

     return this.CustomErrors.Count == 0 && Errors.Count == 0; 
    } 

Затем, если Validate() возвращает false, вы можете добавить причину непосредственно помимо/под правильным полем на своей веб-странице.

Если Validate() возвращает true, вы можете безопасно вызвать Save(), но имейте в виду, что Save() может вызывать другие ошибки во время прочности, такие как «Dublicate Key ...»;

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

  • Нет связанных вопросов^_^