【问题标题】:Orchard how to access Model part in ControllerOrchard如何访问Controller中的Model部分
【发布时间】:2015-02-21 09:27:38
【问题描述】:

我有一个包含可验证的模型。我想在控制器中访问那个可验证的,但我没有任何运气。谁能告诉我该怎么做?

我的模型:

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

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

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

【问题讨论】:

  • 还是不清楚。您似乎所谓的本地设置只是小部件部分的属性,对吗?您是否已经引用了该小部件?
  • 值得向我们展示一切都是真诚的。看来您在这里缺少一些基础知识。
  • 是的,本地设置只是我的小部件部分的属性。你还需要什么?迁移?
  • 我已经添加了migration.cs,我不知道你还需要什么,因为现在或多或少是所有代码。我不知道我做错了什么,但是这两个设置都被写入了数据库,我通常可以在我的视图中访问这两个设置,但我只能进入控制器中的“全局设置”。

标签: asp.net asp.net-mvc orchardcms orchardcms-1.8


【解决方案1】:

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

【讨论】:

  • 我添加了控制器、处理程序和驱动程序。并解释我正在尝试做的事情。希望你能帮助我为什么我可以通过 IOrchardServices 访问“globalsetting”,但不能对“localsettings”做同样的事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 2017-07-15
相关资源
最近更新 更多