Orchardcms 使用Orchard中不同模块的零件
我想做的是在Orchard中创建一个用户无法注册的站点。管理员将创建用户 我所拥有的是一个模块,它定义了基本工作的部分、记录、视图等 现在我要做的是将一个用户部分(来自Orchard.Users)添加到模块中的一个部分 我不知道该怎么做。我需要在同一视图中显示UserPart的字段和父部件的字段。这还需要以这样一种方式完成,即当保存发生时,所有的UserPart字段都会被发送到Orchard.Users模块 有关于如何做到这一点的建议、指针或链接吗 谢谢 更新 激活过滤器是一个有趣的想法。我最初选择了迁移路线。现在,我将尝试使该方法起作用 为了简单起见,假设我有一个“Company”类型(实际类型有更多内容),它有一个“CompanyName”和一个UserPart 这是不同的部分看起来像什么 Migrations.cs(简化版) 公司合伙人记录Orchardcms 使用Orchard中不同模块的零件,orchardcms,Orchardcms,我想做的是在Orchard中创建一个用户无法注册的站点。管理员将创建用户 我所拥有的是一个模块,它定义了基本工作的部分、记录、视图等 现在我要做的是将一个用户部分(来自Orchard.Users)添加到模块中的一个部分 我不知道该怎么做。我需要在同一视图中显示UserPart的字段和父部件的字段。这还需要以这样一种方式完成,即当保存发生时,所有的UserPart字段都会被发送到Orchard.Users模块 有关于如何做到这一点的建议、指针或链接吗 谢谢 更新 激活过滤器是一个有趣的想法。我最初
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>();