У меня есть модель, которая содержит veriable. Я хотел бы получить доступ к этой версии в контроллере, но мне не повезло. Может ли кто-нибудь сказать мне, как я могу это сделать?
Мои модели:
public class Interspire_MailingPart : ContentPart<Interspire_MailingPartRecord>
{
[Required]
public String SubscribeFormID
{
get { return Retrieve(r => r.SubscribeFormID); }
set { Store(r => r.SubscribeFormID, value); }
}
}
public class Interspire_MailingPartRecord : ContentPartRecord
{
public virtual String SubscribeFormID { get; set; }
}
Я устанавливаю их, когда добавляю виджет. Моя миграция и все в порядке.
РЕДАКТИРОВАТЬ: Чтобы уточнить, что я пытаюсь сделать: я хочу, чтобы мой модуль имел 2 разных типа настроек. Тот, который будет на уровне сайта, чтобы каждый виджет был одинаковым. Затем на уровне виджетов, поэтому каждый добавляемый виджет будет иметь разные настройки.
И я хочу получить доступ к обеим настройкам в моем контроллере.
Но я могу получить доступ только к глобальным настройкам, но локальные настройки возвращают пустую строку.
Контроллер
public class MailControllerWebApi : ApiController
{
public MailControllerWebApi(IOrchardServices orchardServices)
{
Services = orchardServices;
T = NullLocalizer.Instance;
}
public IOrchardServices Services { get; private set; }
public Localizer T { get; set; }
public string Get(string Email) {
var localSettings = Services.WorkContext.CurrentSite.As<Interspire_MailingPart>();
var globalSettings = Services.WorkContext.CurrentSite.As<Interspire_MailingSettingsPart>();
return localSettings.SubscribeFormID;
}
}
Оба обработчика:
public class MailingSettingsHandler: ContentHandler
{
public MailingSettingsHandler(IRepository<Interspire_MailingSettingsPartRecord> repository)
{
T = NullLocalizer.Instance;
Filters.Add(new ActivatingFilter<Interspire_MailingSettingsPart>("Site"));
Filters.Add(new TemplateFilterForPart<Interspire_MailingSettingsPart>("Nastavitve", "Parts/MailingSettings", "Interspire"));
Filters.Add(StorageFilter.For(repository));
}
public Localizer T { get; set; }
protected override void GetItemMetadata(GetContentItemMetadataContext context) {
if (context.ContentItem.ContentType != "Site")
return;
base.GetItemMetadata(context);
context.Metadata.EditorGroupInfo.Add(new GroupInfo(T("Interspire")));
}
}
public class MailingHandler: ContentHandler
{
public MailingHandler(IRepository<Interspire_MailingPartRecord> repository)
{
T = NullLocalizer.Instance;
Filters.Add(new ActivatingFilter<Interspire_MailingPart>("Site"));
Filters.Add(StorageFilter.For(repository));
}
public Localizer T { get; set; }
}
И водитель:
public class MailingDriver : ContentPartDriver<Interspire_MailingPart>
{
private readonly IOrchardServices _services;
public MailingDriver(INotifier notifier, IOrchardServices services)
{
_services = services;
}
protected override DriverResult Display(Interspire_MailingPart part, string displayType, dynamic shapeHelper)
{
var mailingSettings = _services.WorkContext.CurrentSite.As<Interspire_MailingSettingsPart>();
return ContentShape("Parts_Mailing",
() => shapeHelper.Parts_Mailing(
Url: mailingSettings.Url,
SubscribeFormID: part.SubscribeFormID
));
}
//GET
protected override DriverResult Editor(Interspire_MailingPart part, dynamic shapeHelper)
{
return ContentShape("Parts_Mailing_Edit",
() => shapeHelper.EditorTemplate(
TemplateName: "Parts/Mailing",
Model: part,
Prefix: Prefix));
}
//POST
protected override DriverResult Editor(Interspire_MailingPart part, IUpdateModel updater, dynamic shapeHelper)
{
updater.TryUpdateModel(part, Prefix, null, null);
return Editor(part, shapeHelper);
}
}
Globalsettings обычно получают данные, но localsetting просто возвращает пустую строку.
EDIT2 Файл миграции:
public int Create() {
ContentDefinitionManager.AlterTypeDefinition("InterspireMailingWidget", cfg => cfg
.WithPart("Interspire_MailingPart")
.WithPart("WidgetPart")
.WithPart("CommonPart")
.WithSetting("Stereotype", "Widget"));
SchemaBuilder.CreateTable("Interspire_MailingPartRecord", table => table
.ContentPartRecord()
.Column("SubscribeFormID", DbType.String)
);
SchemaBuilder.CreateTable("Interspire_MailingSettingsPartRecord", table => table
.ContentPartRecord()
.Column("Url", DbType.String)
);
ContentDefinitionManager.AlterPartDefinition("Interspire_MailingPart",
builder => builder.Attachable());
return 1;
}