Orchardcms 使用Orchard中不同模块的零件

Orchardcms 使用Orchard中不同模块的零件,orchardcms,Orchardcms,我想做的是在Orchard中创建一个用户无法注册的站点。管理员将创建用户 我所拥有的是一个模块,它定义了基本工作的部分、记录、视图等 现在我要做的是将一个用户部分(来自Orchard.Users)添加到模块中的一个部分 我不知道该怎么做。我需要在同一视图中显示UserPart的字段和父部件的字段。这还需要以这样一种方式完成,即当保存发生时,所有的UserPart字段都会被发送到Orchard.Users模块 有关于如何做到这一点的建议、指针或链接吗 谢谢 更新 激活过滤器是一个有趣的想法。我最初

我想做的是在Orchard中创建一个用户无法注册的站点。管理员将创建用户

我所拥有的是一个模块,它定义了基本工作的部分、记录、视图等

现在我要做的是将一个用户部分(来自Orchard.Users)添加到模块中的一个部分

我不知道该怎么做。我需要在同一视图中显示UserPart的字段和父部件的字段。这还需要以这样一种方式完成,即当保存发生时,所有的UserPart字段都会被发送到Orchard.Users模块

有关于如何做到这一点的建议、指针或链接吗

谢谢

更新

激活过滤器是一个有趣的想法。我最初选择了迁移路线。现在,我将尝试使该方法起作用

为了简单起见,假设我有一个“Company”类型(实际类型有更多内容),它有一个“CompanyName”和一个UserPart

这是不同的部分看起来像什么

Migrations.cs(简化版)

公司合伙人记录

public class CompanyPartRecord : ContentPartRecord
{
    public virtual string CompanyName { get; set; }
    public virtual int? UserId { get; set; }
}                                    
公司部分

public class CompanyPart : ContentPart<CompanyPartRecord>
{
    internal LazyField<UserPart> UserPartField = new LazyField<UserPart>();

    public string CompanyName
    {
        get { return Record.CompanyName; }
        set { Record.CompanyName = value; }
    }

    public UserPart User
    {
        get { return UserPartField.Value;}
        set { UserPartField.Value = value; }
    }
}   
编辑器模板

@model SDS.Models.CompanyPart

<fieldset>
    @Html.LabelFor(m => m.CompanyName)
    @Html.TextBoxFor(m => m.CompanyName)
</fieldset>

@*

What goes here to display UserPart?

*@
@model SDS.Models.CompanyPart
@LabelFor(m=>m.CompanyName)
@Html.TextBoxFor(m=>m.CompanyName)
@*
这里显示的是什么用户部分?
*@
这就是我要说的。我可以看到ContentItem(CompanyType)。我可以输入名称并保存它。该名称将保存到数据库中。现在UserPart被保存到数据库中,但是所有字段都是空的

我一直关注的部分是如何在编辑器模板中显示UserPart字段,以便将值传递给UserPart驱动程序,最终传递给db

有什么办法吗


谢谢

因此,您不必将零件附加到零件,而是将零件附加到内容项,您可以通过多种方式来实现

您可以通过“管理”屏幕执行此操作,但这不是代码驱动的解决方案,如果您有多个环境或需要重新部署新版本的代码,则会出现问题

在迁移中创建新内容项时,可以附加零件。这可能是一个很好的解决方案,如果您已经运行了迁移,那么可以通过更新迁移来完成。这允许通过管理屏幕管理部件,但有缺点,因为它可以被删除,如果您有依赖部件的代码,那么您将开始出现错误

最后一种也是最好的方法是使用

ActivatingFilter类-将部件从代码附加到内容类型。与通过迁移附着零件不同,使用此过滤器附着的零件既不会显示在仪表板中,也不能从类型中删除。这是一种合法的方式来附加应该始终存在于给定内容类型上的部分

因此,要做到这一点: 1.向自定义项目添加对Orchard.Users的引用。 2.为您的零件创建处理程序。比如MyPartHandler 3.然后像这样添加激活处理程序

Filters.Add(ActivatingFilter.For<UserPart>("MyContentType"));
Filters.Add(激活filter.For(“MyContentType”);
因此,现在在代码中的任何地方都可以访问UserPart,如果您已经拥有您的part,或者使用

var userPart = myPart.As<UserPart>();
var userPart=myPart.As();

因此,您不必将零件附加到零件,而是将零件附加到内容项,您可以通过多种方式来实现

您可以通过“管理”屏幕执行此操作,但这不是代码驱动的解决方案,如果您有多个环境或需要重新部署新版本的代码,则会出现问题

在迁移中创建新内容项时,可以附加零件。这可能是一个很好的解决方案,如果您已经运行了迁移,那么可以通过更新迁移来完成。这允许通过管理屏幕管理部件,但有缺点,因为它可以被删除,如果您有依赖部件的代码,那么您将开始出现错误

最后一种也是最好的方法是使用

ActivatingFilter类-将部件从代码附加到内容类型。与通过迁移附着零件不同,使用此过滤器附着的零件既不会显示在仪表板中,也不能从类型中删除。这是一种合法的方式来附加应该始终存在于给定内容类型上的部分

因此,要做到这一点: 1.向自定义项目添加对Orchard.Users的引用。 2.为您的零件创建处理程序。比如MyPartHandler 3.然后像这样添加激活处理程序

Filters.Add(ActivatingFilter.For<UserPart>("MyContentType"));
Filters.Add(激活filter.For(“MyContentType”);
因此,现在在代码中的任何地方都可以访问UserPart,如果您已经拥有您的part,或者使用

var userPart = myPart.As<UserPart>();
var userPart=myPart.As();

您只需将Orchard.Users的用户部分附加到您在moduleOK中创建的自定义内容类型,这是如何完成的?您的描述对我来说没有意义。听起来您想用自己的数据扩展orchard用户。你能给出一个详细的具体例子吗?是的,我正在尝试创建一个“公司”类型。公司类型有2个属性。“名称”属性和“用户”属性。Name属性只是一个字符串。用户属性是UserPart。这个想法是管理员将创建一个公司(即没有用户注册)。一旦公司成立,用户将收到一封电子邮件,将他们带回网站。此时,用户将设置其密码。从那时起,将使用标准登录机制。您只需将Orchard的UserPart.Users附加到您在moduleOK中创建的自定义内容类型,这是如何完成的?您的描述对我来说没有意义。听起来您想用自己的数据扩展orchard用户。你能给出一个详细的具体例子吗?是的,我正在尝试创建一个“公司”类型。公司类型有2个属性。“名称”属性和“用户”p
@model SDS.Models.CompanyPart

<fieldset>
    @Html.LabelFor(m => m.CompanyName)
    @Html.TextBoxFor(m => m.CompanyName)
</fieldset>

@*

What goes here to display UserPart?

*@
Filters.Add(ActivatingFilter.For<UserPart>("MyContentType"));
var userPart = myPart.As<UserPart>();