Orchardcms 在Orchard中保存回发数据

Orchardcms 在Orchard中保存回发数据,orchardcms,Orchardcms,我是Orchard的新手,在创建新项目时,我很难获取表单数据 我有一个模块,在管理仪表板上创建一个菜单项。该菜单项将加载一个页面,用户可以在其中输入新的“Coach” 教练需要三样东西:名字、姓氏和电子邮件 这是我为这个实现的代码 迁移.cs public class SDSDataMigration : DataMigrationImpl { public int Create() { SchemaBuilder..CreateTable("CoachPart

我是Orchard的新手,在创建新项目时,我很难获取表单数据

我有一个模块,在管理仪表板上创建一个菜单项。该菜单项将加载一个页面,用户可以在其中输入新的“Coach”

教练需要三样东西:名字、姓氏和电子邮件

这是我为这个实现的代码

迁移.cs

public class SDSDataMigration : DataMigrationImpl
{

    public int Create()
    {
        SchemaBuilder..CreateTable("CoachPartRecord", table => table.ContentPartRecord()
.Column("FirstName", DbType.AnsiString, c => c.WithLength(50))                                                                                   
.Column("LastName", DbType.AnsiString, c => c.WithLength(50))                                                                         
.Column("Email", DbType.AnsiString, c => c.WithLength(200)))

        ContentDefinitionManager.AlterPartDefinition("CoachPart", part => part
                                                                          .WithField("FirstName", f => f.OfType("TextField"))
                                                                          .WithField("LastName", f => f.OfType("TextField"))
                                                                          .WithField("Email", f => f.OfType("TextField"))
                                                                          );

        ContentDefinitionManager.AlterTypeDefinition("Coach", type => type.WithPart("CommonPart")
                                                                          .WithPart("CoachPart"));

        return 1;
    }

}
零件/记录

public class CoachPartRecord : ContentPartRecord
{
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string Email { get; set; }
}

public class CoachPart : ContentPart<CoachPartRecord>
{
    public string FirstName
    {
        get { return Record.FirstName; }
        set { Record.FirstName = value; }
    }

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

    public string Email
    {
        get { return Record.Email; }
        set { Record.Email = value; }
    }        
}
处理者

public class CoachPartHandler : ContentHandler
{
    public CoachPartHandler(IRepository<CoachPartRecord> repository)
    {
        Filters.Add(StorageFilter.For(repository));
    }
}
控制器(用于仪表板菜单项)

现在我可以让窗体显示以创建新的coach。当我点击“发布”时,驱动程序中CoachPart参数的所有字段(即FirstName、LastName、Email)都为空

我可以查看http请求,我可以看到我在表单上输入的值,但是它们没有到达CoachPart

你知道为什么CoachPart字段没有归档吗


谢谢

首先,您要在自己的记录上定义属性。因此,您不需要在零件上附加新的文本字段,因此应删除以下内容:

ContentDefinitionManager.AlterPartDefinition("CoachPart", part => part
    .WithField("FirstName", f => f.OfType("TextField"))
    .WithField("LastName", f => f.OfType("TextField"))
    .WithField("Email", f => f.OfType("TextField")));
其次,由于您使用的是orchard content controller的自定义控制器istead,因此必须实现
IUpdateModel
,并对其采取行动:

[Admin]
public class MyController : Controller, IUpdateModel {
    private readonly IContentManager _contentManager;
    private readonly ITransactionManager _transactionManager;

    public MyController(IContentManager contentManager,
        ITransactionManager transactionManager) {

        _contentManager = contentManager;
        _transactionManager = transactionManager;
    }

    [HttpPost, ActionName("Create")]
    public ActionResult CreatePOST()
    {
        var contentItem = _contentManager.New<CoachPart>("Coach");

        // The implementation of IUpdateModel is necessary for this next line:
        var model = _contentManager.UpdateEditor(contentItem, this);

        if (!ModelState.IsValid) {
            _transactionManager.Cancel();
            return View(model);
        }

        _contentManager.Publish(contentItem);

        return View("Index");
    }

    bool IUpdateModel.TryUpdateModel<TModel>(TModel model, string prefix, string[] includeProperties, string[] excludeProperties) {
        return TryUpdateModel(model, prefix, includeProperties, excludeProperties);
    }

    void IUpdateModel.AddModelError(string key, LocalizedString errorMessage) {
        ModelState.AddModelError(key, errorMessage.ToString());
    }
}
[Admin]
公共类MyController:控制器,IUpdateModel{
私有只读IContentManager\u contentManager;
私有只读ITransactionManager\u transactionManager;
公共MyController(IContentManager、contentManager、,
ITransactionManager(事务管理器){
_contentManager=contentManager;
_transactionManager=transactionManager;
}
[HttpPost,ActionName(“创建”)]
公共操作结果CreatePOST()
{
var contentItem=_contentManager.New(“Coach”);
//下一行需要实现IUpdateModel:
var model=\u contentManager.UpdateEditor(contentItem,this);
如果(!ModelState.IsValid){
_transactionManager.Cancel();
返回视图(模型);
}
_contentManager.Publish(contentItem);
返回视图(“索引”);
}
bool IUpdateModel.TryUpdateModel(TModel模型,字符串前缀,字符串[]includeProperties,字符串[]excludeProperties){
返回TryUpdateModel(模型、前缀、IncludeProperty、excludeProperties);
}
void IUpdateModel.AddModelError(字符串键,LocalizedString errorMessage){
AddModelError(key,errorMessage.ToString());
}
}

谢谢!就这样。我必须实现一个编辑器模板。我还必须更改代码_contentManager.Publish(contentItem);到_contentManager.Publish(contentItem.contentItem);但从那以后它开始存钱了。我已经追了几天了。谢谢
public ActionResult Create()
    {
        var coach = _services.ContentManager.New("Coach");
        var model = _services.ContentManager.BuildEditor(coach);
        return View(model);
    }

    [HttpPost, ActionName("Create")]
    public ActionResult CreatePOST()
    {
        var contentItem = _services.ContentManager.New("Coach");
        _services.ContentManager.Publish(contentItem);

        return View("Index");
    }
ContentDefinitionManager.AlterPartDefinition("CoachPart", part => part
    .WithField("FirstName", f => f.OfType("TextField"))
    .WithField("LastName", f => f.OfType("TextField"))
    .WithField("Email", f => f.OfType("TextField")));
[Admin]
public class MyController : Controller, IUpdateModel {
    private readonly IContentManager _contentManager;
    private readonly ITransactionManager _transactionManager;

    public MyController(IContentManager contentManager,
        ITransactionManager transactionManager) {

        _contentManager = contentManager;
        _transactionManager = transactionManager;
    }

    [HttpPost, ActionName("Create")]
    public ActionResult CreatePOST()
    {
        var contentItem = _contentManager.New<CoachPart>("Coach");

        // The implementation of IUpdateModel is necessary for this next line:
        var model = _contentManager.UpdateEditor(contentItem, this);

        if (!ModelState.IsValid) {
            _transactionManager.Cancel();
            return View(model);
        }

        _contentManager.Publish(contentItem);

        return View("Index");
    }

    bool IUpdateModel.TryUpdateModel<TModel>(TModel model, string prefix, string[] includeProperties, string[] excludeProperties) {
        return TryUpdateModel(model, prefix, includeProperties, excludeProperties);
    }

    void IUpdateModel.AddModelError(string key, LocalizedString errorMessage) {
        ModelState.AddModelError(key, errorMessage.ToString());
    }
}