2015-02-21 1 views
0

У меня есть модель, которая содержит достоверную. Я хотел бы получить доступ к этому контроллеру, но мне не повезло. Может ли кто-нибудь сказать мне, как я могу это сделать?Orchard Как добраться до Model part in Controller

Мои модели:

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; } 
} 

Я поставил их, когда я добавить виджет. Моя миграция и все в порядке.

EDIT: Чтобы уточнить, что я пытаюсь сделать: Я хочу, чтобы мой модуль имел 2 разных типа настроек. Тот, который будет на уровне сайта, чтобы каждый виджет имел то же самое. Затем на уровне виджета, чтобы каждый добавленный вами виджет имел разные настройки.

И я хочу получить доступ к обоим настройкам в своем контроллере.

Но я могу получить доступ только к globalsetting, но localsetting возвращает emptystring.

Контроллер

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; 
    } 
+0

Еще не ясно. То, что вы, кажется, называете локальными настройками, - это просто свойства на частях вашего виджета, не так ли? У вас уже есть ссылка на этот виджет? –

+0

Было бы полезно показать нам все, чтобы быть искренним. кажется, вам не хватает некоторых основ. – ErMasca

+0

Да, локальные настройки - это свойства только на частях моего виджета. Что еще вам нужно? Миграция? –

ответ

1

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

+0

Я добавил контроллер, обработчики и драйвер. И объяснение того, что я пытаюсь сделать. Надеюсь, вы можете помочь мне, почему я могу получить доступ к «globalsetting» через IOrchardServices, но не могу сделать то же самое для «localsettings», –