我构建了一个自定义模块,用于管理基于服务的公司的约会。所有当前功能都包含在管理部分中。我没有使用过单个ContentItem或ContentPart。所有模型都只是简单的记录。
我正在寻找创建一个小部件来公开从前端注册约会的能力。我有一个局部视图和一个处理显示和表单提交的控制器,但我不知道如何将它绑定到可放置在前端的一个内容区域中的小部件中。
我花了很多时间研究这个,但找不到合适的路径。 (我尝试了一些并得到次优结果)
有什么建议吗?
答案 0 :(得分:0)
对我来说,最好的答案是在模块的migration.cs文件中创建一个小部件类型定义:
ContentDefinitionManager.AlterTypeDefinition("CreateAppointmentWidget",
cfg => cfg
.WithPart("WidgetPart")
.WithPart("CommonPart")
.WithSetting("Stereotype", "Widget"));
然后在/MyModule/Handlers/CreateAppointmentWidgetHandler.cs
创建该窗口小部件的处理程序:
public class CreateAppointmentWidgetHandler : ContentHandler
{
private readonly IRepository<FieldTechRecord> _repository;
public CreateAppointmentWidgetHandler(IRepository<FieldTechRecord> repository)
{
_repository = repository;
}
protected override void BuildDisplayShape(BuildDisplayContext context)
{
base.BuildDisplayShape(context);
if (context.ContentItem.ContentType == "CreateAppointmentWidget")
{
CreateAppointmentViewModel model = new CreateAppointmentViewModel(_repository.Fetch(x => x.IsActive));
context.Shape.AppointmentModel = model;
}
}
}
然后在/MyModule/Views/Widget-CreateAppointmentWidget.cshtml
创建一个匹配的小部件模板,插入部分视图:
@Html.Partial("CreateAppointment", (MyModule.Models.Views.CreateAppointmentViewModel)Model.AppointmentModel)
上面的代码抓取了部分视图/MyModule/Views/CreateAppointment.cshtml
。
感谢Giscard的建议,我能够通过使用@ Url.RouteUrl()并定义命名的路由来更正从CreateAppointment.cshtml呈现的链接,以指向我需要操作和ajax请求的地方去。
这个解决方案的好处在于它提供了一种创建窗口小部件的方法,而无需重新设计我的模型以使用Orchards ContentPart功能。
答案 1 :(得分:0)
我脑子里没有连接东西,因为我已经能够创建一个带有区域的主题,然后从我的模块中将一个形状发送到该区域,而不仅仅是做@ Display.Shape()。所以我很好奇是否必须使用处理程序来覆盖BuildDisplayShape
。
同样,在这种情况下,您将模型作为普通记录(不使用ContentItem或ContentPart - 即使不使用它们,您也会显示通过迁移创建模型的示例)。
像这样的东西 - 控制器:
public ShapeResult MyShape()
{
var shape = _orchardServices.New.MyPath1_MyShape();
return new ShapeResult(this, shape);
}
然后用我拥有的任何代码创建一个MyShape.cshtml形状(不需要例子)。
注意:我使用自定义IShapeTemplateHarvester
文件添加路径,我可以存储我的形状(而不是使用“视图”,“视图/项目”,“视图/部件”,“视图/字段”,这是乌节的股票)。它是这样的:
注意:我讨厌代码不会自动换行。
[OrchardSuppressDependency("Orchard.DisplayManagement
.Descriptors.ShapeTemplateStrategy.BasicShapeTemplateHarvester")]
public class MyShapeTemplateHarvester : BasicShapeTemplateHarvester,
IShapeTemplateHarvester
{
public new IEnumerable<string> SubPaths()
{
var paths = base.SubPaths().ToList();
paths.Add("Views/MyPath1");
paths.Add("Views/MyPath2");
return paths;
}
}
假设我的主题中有Index.cshtml。我有两个选择(我使用两个选项并使用主题作为默认演示文稿)。
主题文件夹中的Index.cshtml:
@*Default Content*@
模块文件夹中的Index.cshtml:
@*Special Content overriding Theme's Index.cshtml*@
Display.MyPath1_MyShape()
对我来说更好的是我可以在Theme文件夹的Index.cshtml中执行此操作:
@*Whatever content*@
Display.MyPath1_MySecondShape()
主题中没有〜/ MyPath1 / MySecondShape.cshtml,但主题中显示了一个模块中的一个!这很好,因为我可以有一个特殊的主题,并有多个模块(放在不同的网站上)与主题来回(想想不同网站上同一职业的不同服务的仪表板)。
注意:上述内容可能仅适用于IThemeSelector
,例如:
public class MyThemeSelector : IThemeSelector
{
public ThemeSelectorResult GetTheme(RequestContext context)
{
if (MyFilter.IsApplied(context))
{
return new ThemeSelectorResult { Priority = 200,
ThemeName = "MyDashboard" };
}
return null;
}
}
只是我的两位。