Orchardcms Orchard 1.7中的Crating自定义小部件

Orchardcms Orchard 1.7中的Crating自定义小部件,orchardcms,Orchardcms,我刚到乌节。所以,如果有什么看起来很愚蠢的事情,请原谅我 我想为我的Orchard网站创建一个自定义小部件,以鼓励访问者注册我的时事通讯服务。我已经看到有一个使用HTML小部件的选项,但我想创建一个新的小部件类型,如“新闻稿”,我将在AsideFirst块有条件地使用它 这可能吗?我只想获取访问者的姓名和电子邮件地址,表单提交将使用操作控制器完成 我必须在VS中手工编码来创建这个小部件吗?事实上,我想这样做,而不是通过Orchard管理控制台 寻求帮助。有什么建议吗 编辑: 我已经按照Sipke

我刚到乌节。所以,如果有什么看起来很愚蠢的事情,请原谅我

我想为我的Orchard网站创建一个自定义小部件,以鼓励访问者注册我的时事通讯服务。我已经看到有一个使用HTML小部件的选项,但我想创建一个新的小部件类型,如“新闻稿”,我将在AsideFirst块有条件地使用它

这可能吗?我只想获取访问者的姓名和电子邮件地址,表单提交将使用操作控制器完成

我必须在VS中手工编码来创建这个小部件吗?事实上,我想这样做,而不是通过Orchard管理控制台

寻求帮助。有什么建议吗

编辑: 我已经按照Sipke Schoorstra的建议创建了这个小部件。我想显示小部件的区域现在显示在我将其添加到区域时从admin设置的标题旁边。但是我在视图中创建的内容(表单元素)没有显示

视图:(Views/newslettesignuppart/newslettesignup.cshtml) 简讯
我哪里做错了?

/admin
界面中,单击功能选项卡上的模块,搜索自定义表单,然后单击启用。这将在左侧添加一个新的表单管理链接

接下来,创建一个名为新闻稿的自定义内容类型(在“内容定义”下),并添加两个名为“名称”和“电子邮件”的字段(文本字段类型)

最后,单击表单并添加新的自定义表单。给它一个标题:这将是访问的默认URL,例如,“新闻稿表单”的URL将为/Newsletter Form,默认为Orchard。在“内容类型”下,从下拉列表中选择新创建的内容类型“新闻稿”。自定义此页面上需要的任何其他内容,然后单击“立即发布”


如果您想使其成为小部件,请编辑内容类型并添加小部件部分。创建一个包含所需规则的层,您可以将“新闻稿”小部件添加到该层上所需的任何区域。

如果您不想或不需要自己编写代码,自定义表单模块非常棒。如果您确实希望自己处理表单提交而不使用自定义表单,您可以这样做:

  • 创建自定义模块
  • 创建一个定义新小部件内容类型的迁移类(有关如何执行此操作的详细信息,请参阅文档。注意:您不需要创建自定义部件。您甚至不需要创建迁移文件来创建内容类型-您可以使用配方文件来完成。不过,迁移的好处是,当您的模块功能启用时,它将自动执行)
  • 为小部件类型的内容项创建特定的视图(例如,widget Newsletter.cshtml)
  • 在此视图内,编写包含表单元素和输入元素的标记。将此表单发回控制器
  • 创建您的控制器

  • 你能详细解释一下为什么要硬编码吗?默认情况下,使用自定义表单模块可以使用这种功能。什么是自定义表单模块?不,我不想硬编码任何东西。我只想通过我已经构建的自定义模块中的代码创建一个小部件。Orchard提供了一些开箱即用的小部件,如博客存档,ProjeAction Widget等。我想创建另一个类似于这些的可重用小部件。自定义表单,您提到过,我可以在管理中找到它吗?我可以像小部件/可重用控件一样使用它吗?谢谢您的建议。但是我的要求可能比这简单得多。我只想创建一个小部件和相应的控制器来处理postback。数据库中不会存储任何数据,因此我不需要Migration.cs中的任何表定义。简而言之,我需要的是一个可重用的小部件(如asp.net中的usercontrol),一个用于定义表单元素的razor视图和一个用于处理回发的控制器,我可以将回发放在网站的任何位置。我如何实现这一点?再次为这些史前问题感到抱歉!我遵循了您的方式,但视图中的内容没有呈现在页面上。我已经用我迄今为止所做的编辑了我的原始问题。我错在哪里oing?:(视图的名称似乎不正确。您的小部件内容类型是“NewsletterWidget”,因此请将您的视图重命名为“widget NewsletterWidget.cshtml”。我感到困惑:在我的回答中,我从未提到存储数据。而您却创建了“NewsletterSignupRecord”类。如果不需要存储数据,则不需要创建记录类。只需让您的新闻稿SignupPart从ContentPart而不是ContentPart派生即可。是的,您是对的。我不需要存储数据,因此记录类不应该存在。我将删除它。我将很快进行更改,并用我得到的更新。
    @model Emfluence.Intrust.Models.NewsLetterSignupPart
    @{
    ViewBag.Title = "Newsletter Signup";
    }
    @using (Html.BeginForm("NewsletterSignup", "NewsLetter", FormMethod.Post))
    {
    @Html.AntiForgeryToken()
    <div class="row-fluid">
    <div class="span6">
    <label>Name</label>
    <input type="text" name="txtNewsletterUserName" required maxlength="50" style="width: 95%" />
    <label>Email</label>
    <input name="txtNewsletterUserEmail" type="email" required maxlength="85" style="width: 95%" />
    <button class="btn pull-right">Submit</button>
    </div>
    </div>
    }
    
    public int UpdateFrom15()
    {
    ContentDefinitionManager.AlterTypeDefinition(
    "NewsletterWidget", cfg => cfg
    .WithPart("NewsLetterSignupPart")
    .WithPart("CommonPart")
    .WithPart("WidgetPart")
    .WithSetting("Stereotype", "Widget")
    );
    return 16;
    }
    
    public class NewsLetterSignupPart : ContentPart<NewsletterSignupRecord>
    {
    [Required]
    public string Name
    {
    get { return Record.Name; }
    set { Record.Name = value; }
    }
    [Required]
    public string Email
    {
    get { return Record.Email; }
    set { Record.Email = value; }
    }
    }
    
    public class NewsletterSignupRecord : ContentPartRecord
    {
    public virtual string Name { get; set; }
    public virtual string Email { get; set; }
    }