Orchard, как получить доступ к части модели в контроллере

У меня есть модель, которая содержит 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;
    }

person Tadej Vengust    schedule 21.02.2015    source источник
comment
Все еще не ясно. То, что вы называете локальными настройками, — это просто свойства частей вашего виджета, верно? У вас уже есть ссылка на этот виджет?   -  person Bertrand Le Roy    schedule 22.02.2015
comment
Стоило бы показать нам все, чтобы быть искренним. кажется, вам не хватает некоторых основ здесь.   -  person ErMasca    schedule 22.02.2015
comment
Да, локальные настройки — это просто свойства частей моего виджета. Что еще тебе нужно? Миграция?   -  person Tadej Vengust    schedule 22.02.2015
comment
Я добавил migration.cs, я не знаю, что еще вам нужно, так как теперь это более или менее весь код. Я не знаю, что я делаю неправильно, но обе настройки записываются в базу данных, и я обычно могу получить доступ к обоим в своих представлениях, но я могу получить доступ только к глобальным настройкам в контроллере.   -  person Tadej Vengust    schedule 23.02.2015


Ответы (1)


Не могли бы вы показать нам код вашего контроллера? Обычно вы вводите IContentManager или получаете его из IOrchardServices и используете _contentManager.Get(...) или _contentManager.Query(...), проверьте их. Погуглите, и вы увидите, как это делают другие.

person ErMasca    schedule 21.02.2015
comment
Я добавил контроллер, обработчики и драйвер. И объяснение того, что я пытаюсь сделать. Надеюсь, вы поможете мне понять, почему я могу получить доступ к глобальным настройкам через IOrchardServices, но не могу сделать то же самое для локальных настроек. - person Tadej Vengust; 21.02.2015