Дозвуковой - Где я могу включить мою бизнес-логику или пользовательскую проверку - PullRequest
0 голосов
/ 06 октября 2010

Я использую дозвуковой 2,2

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

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

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

Любая информация с благодарностью.

Ответы [ 3 ]

1 голос
/ 07 октября 2010

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

Сначала посмотрите здесь: http://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/ActiveRecord/ActiveRecord.cs

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

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

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

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

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

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

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

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

Я бы посоветовал вам вызвать Validate () самостоятельно, и если он вернет false, вы отобразите элементы этого. Ошибки внизу страницы (простой способ) или (более элегантно) вы создадите 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 ...»;

1 голос
/ 06 октября 2010

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

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

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

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

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 голосов
/ 06 октября 2010

Спасибо за ответ, но можете ли вы подтвердить это для меня как немного запутанный, если ваша проверка значения столбца (ProductName) в validate () или beforevalidate () пустая или пустая, это не означает, что вставка/ update уже был выполнен, иначе он не знал бы, что вы пытались вставить или обновить нулевое значение из полей пользовательского интерфейса / aspx на странице в столбце ??

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

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

Я полагаю, что я немного запутался в жизненном цикле для этих методов и когда они вступают в игру

...