在Orchard中更新ContentItem的正确方法是什么?

Beh*_*ili 5 .net c# asp.net asp.net-mvc orchardcms

我正在尝试使用以下代码更新特定部分:

var nationalPart = _contentManager.Get<NationalPart>(Id);      
nationalPart.Name = part.Name;
Run Code Online (Sandbox Code Playgroud)

我已经这样做了.但是现在它没有用.即使我contentManager.Flush()明确打电话,但仍然没有运气.谁能帮我这个?提前致谢.

编辑:我发现我的问题来自哪里!当我发出更新contentPart的JSON请求时,内存版本正在更新,但它没有将结果反映给db.now我们离答案又近了一步.但是什么阻止会话更新数据库?

EDIT2:

这是我的处理程序的代码:

        public NationalPartHandler(IRepository<NationalPartRecord> repository)
        {
            Filters.Add(StorageFilter.For(repository));
        }
Run Code Online (Sandbox Code Playgroud)

这是Controller Action的代码:

    [GridAction(EnableCustomBinding = true)]
    public JsonResult UpdateNational(NationalViewModel Model, GridCommand Command)
    {
         if (!ModelState.IsValid)
            return new JsonResult { Data = "error" };
        var NationalPart = _contentmanager.Get(Model.Id).As<NationalPart>();
        NationalPart.Record = new NationalPartRecord();
        NationalPart.Record.MapFrom<NationalPartRecord, NationalViewModel>(Model);
        _soccerService.UpdateNational(NationalPart);         
        return NationalsListJson(Command);
    }
Run Code Online (Sandbox Code Playgroud)

最后代码为服务:

public void UpdateNational(NationalPart part)
{
    var nationalPart = _contentManager.Get<NationalPart>(part.Id);      
    nationalPart.Name = part.Name;
    _contentManager.Flush();
}
Run Code Online (Sandbox Code Playgroud)

Pio*_*myd 6

删除该行

NationalPart.Record = new NationalPartRecord();
Run Code Online (Sandbox Code Playgroud)

底层记录是自动生成的并且是代理的,因此只要您对数据库进行任何更改,NHibernate就可以将数据保存到数据库中.您不想替换它,否则不会保存任何数据.

UpdateNational是多余的,你可以删除它 - 你已经拥有part.Name(如果我理解正确,应该映射到part.Record.Name)在调用期间设置record.MapFrom.

所以正确的版本看起来像这样

[GridAction(EnableCustomBinding = true)]
public JsonResult UpdateNational(NationalViewModel Model, GridCommand Command)
{
     if (!ModelState.IsValid)
        return new JsonResult { Data = "error" };
    var part = _contentmanager.Get(Model.Id).As<NationalPart>();
    part.Record.MapFrom<NationalPartRecord, NationalViewModel>(Model);        
    return NationalsListJson(Command);
}
Run Code Online (Sandbox Code Playgroud)

鉴于您的NationalPart看起来类似于:

public NationalPart : ContentPart<NationalPartRecord>
{
    public string Name {
        get { return Record.Name; }
        set { Record.Name = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

总结 - 如果您想在Orchard中存储一些数据,您需要做的就是设置记录的某些属性的值,仅此而已.数据将在请求结束时保留(或者更早,如果您调用IContentManager.Flush()).