Orchard如何访问控制器中的模型部件



我有一个包含可验证性的模型。我想访问那个可验证的控制器,但我运气不好。有人能告诉我怎么做吗?

我的型号:

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

我在添加小部件时设置了它们。我的迁移和一切都很好。

编辑:为了澄清我要做的事情:我希望我的模块有两种不同的设置。一个将在站点级别,这样每个小部件都会有相同的。然后在小部件级别,这样你添加的每个小部件都会有不同的设置。

我想在我的控制器中访问这两个设置。

但是我只能访问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);
    }
}

全局设置正常获取数据,但本地设置只返回一个空字符串。

编辑2迁移文件:

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

你能给我们看看你的控制器代码吗?通常,您会注入IContentManager或从IOrchardServices获取它,然后使用_contentManager.Get(…)或_contentMnager.Query(…),查看这些。谷歌一下,你就会看到其他人是怎么做的。

最新更新