Да, вам нужно написать новый модуль, который предоставляет новую часть контента и драйвер части контента.Этот драйвер будет отвечать за выборку данных с внешнего SQL Server, для которого вы установите свойство в форме, которую вы будете возвращать из своего драйвера.Вид фигуры будет отображать ваши данные.
Этот туториал проведет вас через написание пользовательской части контента: http://docs.orchardproject.net/en/latest/Documentation/Writing-a-content-part/
Когда вы это сделаете, убедитесь, что не , чтобысоздайте тип записи части содержимого, поскольку вы не будете хранить и загружать данные из базы данных Orchard - вы хотите загружать данные из внешней базы данных.Вот шаги, которые вы должны выполнить:
- Создать новый модуль
- Создать класс части контента
- Ваша часть наследуется от
ContentPart
, не ContentPart<TRecord>
, поскольку «TRecord» не будет.
- Создание драйвера части содержимого
- В методе
Display
верните aсформировать, вызвав метод ContentShape
. Обязательно добавьте логику доступа к данным SQL в лямбду .Если вы сделаете это вне этой лямбды, этот код доступа к данным будет вызываться каждый раз, когда вызывается элемент контента, использующий вашу контентную часть.Хотя это звучит так, как будто это именно то, что вы хотите, здесь есть тонкость, которая касается Placement.info, которую вы можете использовать, чтобы определить, когда ваша фигура будет визуализирована или нет.Если логика размещения определяет, что ваша форма не должна отображаться, то вы не хотите получать доступ к внешним данным бесплатно.
- Создайте файл Placement.info для настройки размещения фигуры.(в контексте визуализируемого элемента контента).
- Создайте представление Razor для фигуры, возвращаемой на шаге 3.2.
- Создайте класс Migrations, который определит вашу пользовательскую часть контента,и любые типы контента, к которым вы хотите добавить свою часть.См. http://docs.orchardproject.net/en/latest/Documentation/Understanding-data-access/ для получения дополнительной информации о том, как создавать миграции.
PS.Вместо того, чтобы реализовывать свой код доступа к данным непосредственно в драйвере, я рекомендую вам реализовать его в отдельном классе.Потому что вы знаете, разделение проблем и тому подобное.Затем вы можете добавить эту услугу в свой драйвер.Чтобы ваш класс обслуживания был зарегистрирован в контейнере службы, убедитесь, что вы определили интерфейс для него, который сам является производным от IDependency
.
Некоторые примеры псевдокода:
Сервисный код:
public interface IMyExternalDataStore : IDependency {
IList<MyExternalDataRecord> GetMyData();
}
public class MyExternalDataStore : IMyExternalDataStore {
public IList<MyExternalDataRecord> GetMyData() {
// Connect to your SQL Server database, perhaps using EF, load the data and return it. Could of course also be simply a DataSet.
}
}
Часть содержимого:
public class MyExternalDataPart : ContentPart {
// Nothing here, unless you want to include some properties here that influence the data that you want to load. If so, you'll also want to implement the Editor methods in your content part driver, but I'm keeping it simple.
}
Драйвер части содержимого:
public class MyExternalDataPartDriver : ContentPartDriver<MyExternalContentPart> {
private readonly IMyExternalDataStore _dataStore;
public MyExternalDataPartDriver(IMyExternalDataStore dataStore) {
_dataStore = dataStore;
}
protected override DriverResult Display(SlideShowProPart part, string displayType, dynamic shapeHelper) {
return ContentShape("Parts_MyExternalData", () => {
// Notice that we're performing the data access here within the lambda (the so called "shape factory method").
var data = _dataStore.GetMyData();
// Notice that I'm creating a property called "MyData"on the shape (which is a dynamic object).
return shapeHelper.Parts_MyExternalData(MyData: data));
}
}
}
Представление бритвы для формы Parts_MyExternalData: Имя файла: Parts.MyExternalData.cshtml
@{
var records = (IList<MyExternalDataRecord>)Model.MyData;
}
<ul>
@foreach(var record in records) {
<li>@record.ToString()</li>
}
</ul>
Placement.info:
<Placement>
<Place Parts_MyExternalData="Content:0"/>
</Placement>
Миграции:
public class Migrations : DataMigrationImpl {
public int Create() {
// Define your content part so that you can attach it to any content type from the UI.
ContentDefinitionManager.AlterPartDefinition("MyExternalDataPart", part => part.Attachable());
// Optionally, define a new content type here programmatically or attach it to an existing type.
return 1;
}
}