• Microsoft .NET
  • ASP.NET
  • Инструкция по файлам куки (Сookie) в ASP.NET для новичков

Руководство по Catharsis - часть 3: быстрая разработка приложений - Добавление нового свойства

ОГЛАВЛЕНИЕ

Добавление нового свойства

Если сейчас нажать на кнопку ‘Новый’, то можно увидеть, что свойства, заданные во время настройки руководства (Code, Name и BankCode), добавляются автоматически.



Теперь будут добавлены свойства Gender и Country.

Откройте файл ClientDetailsWC.ascx (Аббревиатура WC означает сетевой контроль)



Этот файл показывает разметку HTML, использованную для создания показанной выше страницы. Будет уменьшен размер двух столбцов (обозначение и описание), добавлен третий столбец для списков кодов, и будут добавлены списки кодов для Gender и Country.

Каждая строка в HTML содержит некоторое количество наборов полей. На данный момент есть один набор полей для обозначения и один для описания. Ширина в процентах этих двух наборов будет уменьшена до 32%, поэтому в строке будет достаточно места для трех наборов полей.

<div class='newRow mh50'>

    <fieldset class='newDetail w32p'>

w32p обозначает класс CSS для ширины. Изучить эти классы CSS можно в следующем файле:



Стиль css .w32p { width: 32%; } будет применяться в данном случае.

Теперь можно добавить третий набор полей для двух списков кодов, код приведен ниже:

 <fieldset class='newDetail w32p'>  
      <legend><%= GetLocalized(Str.Business.CodeLists.CodeList)%></legend>
      <div class='fieldset'>
      
        <div class='inputWC inputWC60 w100p'>
          <div class='label'><%= GetLocalized(Str.Controllers.Country)%></div>
          <div class='input'><% Country.SetEntityAsDataSource(Model.Item.Country); %>
            <smart:AsyncComboBoxWC ID='Country' runat="'server'" TargetController='Country' /> </div>
        </div>

        <div class='inputWC inputWC60 w100p'>
          <div class='label'><%= GetLocalized(Str.Controllers.Gender)%></div>
          <div class='input'><% Gender.SetEntityAsDataSource(Model.Item.Gender); %>
            <smart:AsyncComboBoxWC ID='Gender' runat="'server'" TargetController='Gender' /> </div>
        </div>
    </div>
</fieldset>

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



Попытка по-настоящему добавить нового клиента провалится.



Это происходит из-за того, что при нажатии кнопки добавления контроллер пытается добавить объект, но не может сделать это, так как он еще не может обрабатывать свойства объектного типа. Нужно исследовать контроллер на наличие нового объекта, который был автоматически создан в следующем месте:



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



Полезно знать, что удержание нажатой кнопки CTRL и набор на клавиатуре m o развернет все области, аналогично CTRL m l свернет все области.

 

Члены:     Используется для хранения локальных переменных, используемых в этом классе.

OnList:         Эта область содержит переопределенные методы, которые можно использовать для расширения функциональности для создания списка объектов для отображения его в виде списка в приложении и для экспорта этого списка в электронную таблицу Excel.

OnAfter:       Эта область содержит несколько переопределенных методов, используемых для выполнения задач после того, как произойдут конкретные события. OnAfterBindModel и OnAfterBindSearch реализованы в контроллере по умолчанию. Эти два метода используются для обработки свойств объектного типа, поэтому их можно использовать для добавления страны и пола.

OnBefore:     Как и для вышеупомянутой области, можно переопределить несколько методов из базовых классов в этом разделе. Можно увидеть список доступных методов, набрав на клавиатуре ‘переопределить OnBefore’, и после этого «интеллектуальное восприятие» покажет вам доступные методы.



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

Очистить поиск:  Используется для удаления параметров из объекта поиска после его использования.

Свойства:     Эта область содержит метод, возвращающий имя текущего контроллера, который в данном случае будет ClientController (контроллер клиента). Она также используется для загрузки объектов, которые могут понадобиться, если они являются типами объектов в нашем объекте. Это будет иметь место в нашем примере, так как присутствует два типа объектов. Эти объекты используют метод «ленивой загрузки», то есть они создаются только при наличии потребности в них, что повышает производительность в приложении.

Будут внесены необходимые изменения, позволяющие сохранять нового клиента. Необходимо добавить два метода в область OnAfter для обработки типов объектов

/// <summary>
/// Связывает свойства нечислового типа с элементом
/// </summary>
/// <returns></returns>
protected override bool OnAfterBindModel()
{
    var success = base.OnAfterBindModel();
    int id = 0;
    // Country
    if (Request.Form.AllKeys.Contains(Str.Controllers.Country)
     && int.TryParse(Request.Form[Str.Controllers.Country], out id))
    {
        Model.Item.Country = CountryFacade.GetById(id);
    }
    // Пол
    if (Request.Form.AllKeys.Contains(Str.Controllers.Gender)
     && int.TryParse(Request.Form[Str.Controllers.Gender], out id))
    {
        Model.Item.Gender = GenderFacade.GetById(id);
    }
    return success;}
/// <summary>
/// Связывает свойства нечислового типа с поиском
/// </summary>
/// <returns></returns>
protected override bool OnAfterBindSearch()
{
    var success = base.OnAfterBindSearch();
    int id;
    // Country
    if (Request.Form.AllKeys.Contains(Str.Controllers.Country)) // здесь была некоторая выборка
    {
        Model.SearchParam.Example.Country = null;               // обнуление предыдущих нулю (это может быть заключительный этап)
        if (int.TryParse(Request.Form[Str.Controllers.Country], out id))
        {
            Model.SearchParam.Example.Country = CountryFacade.GetById(id);

        }
    }
    // Пол
    if (Request.Form.AllKeys.Contains(Str.Controllers.Gender)) // здесь была некоторая выборка
    {
        Model.SearchParam.Example.Gender = null;               // обнуление предыдущих нулю (это может быть заключительный этап)
        if (int.TryParse(Request.Form[Str.Controllers.Gender], out id))
        {
            Model.SearchParam.Example.Gender = GenderFacade.GetById(id);

        }
    }
    return success;
}

Как можно видеть из кода, выполняется несколько проверок, чтобы убедиться, что значение для Country было предоставлено на форме (в элементе управления ascx) и для обеспечения того, что переданное значение целочисленное. Затем вызывается CountryFacade, чтобы найти страну, имеющую идентификатор, который был отправлен из формы, и затем возращается объект Country и добавляется в объект Клиент.

Также нужно добавить несколько свойств в область свойств:

 public override string ControllerName { get { return Str.Controllers.Client; } }
/// <summary>
/// Позволяет «лениво» (или при помощи контроллера ввода-вывода) работать со Страной
/// </summary>
public virtual ICountryFacade CountryFacade
{
    protected get
    {
        if (_countryFacade.IsNull())
        {
            _countryFacade = FacadeFactory.CreateFacade<ICountryFacade>(Model.Messages);
        }
        return _countryFacade;
    }
    set
    {
        Check.Require(value.Is(), " ICountryFacade не может быть нулевым");
        _countryFacade = value;
    }
}
/// <summary>
/// Позволяет «лениво» (или при помощи контроллера ввода-вывода) работать с Полом
/// </summary>
public virtual IGenderFacade GenderFacade
{
    protected get
    {
        if (_genderFacade.IsNull())
        {
            _genderFacade = FacadeFactory.CreateFacade<IGenderFacade>(Model.Messages);
        }
        return _genderFacade;
    }
    set
    {
        Check.Require(value.Is(), " IGenderFacade не может быть нулевым");
        _genderFacade = value;
    }
}

Это обеспечивает фасад для двух типов объектов, которые будут использоваться в вышеуказанных методах OnAfter.

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

         #region members
        IGenderFacade _genderFacade;
        ICountryFacade _countryFacade;
        #endregion members

Теперь был добавлен весь требуемый код, который позволит добавить новый клиент.



Только что добавленный клиент можно увидеть в списке, появляющемся после нажатия пункта меню «Клиент»:



Учтите, что пол и страна не появятся в списке. Появляются только те свойства объекта Клиент, которые были заданы в диалоговых окнах руководства при создании сетевой инфраструктуры. Как сказано выше, для обработки свойств Gender и Country нужно развернуть область OnList в элементе управления.