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

标签 c# asp.net .net asp.net-mvc orchardcms

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

var nationalPart = _contentManager.Get<NationalPart>(Id);      
nationalPart.Name = part.Name;

我已经完成了这个。但现在它不起作用。即使我显式调用 contentManager.Flush(),但仍然没有成功。谁能帮我这个? 提前致谢。

编辑:我找到了问题的根源! 当我发出更新 contentPart 的 JSON 请求时。内存中的版本正在更新,但它没有将结果反射(reflect)到 db。现在我们离答案更近了一步。但是是什么阻止了 session 更新数据库?

编辑2:

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

        public NationalPartHandler(IRepository<NationalPartRecord> repository)
        {
            Filters.Add(StorageFilter.For(repository));
        }

这是 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);
    }

最后是服务代码:

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

最佳答案

删除行

NationalPart.Record = new NationalPartRecord();

底层记录是自动生成并被代理的,因此 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);
}

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

public NationalPart : ContentPart<NationalPartRecord>
{
    public string Name {
        get { return Record.Name; }
        set { Record.Name = value; }
    }
}

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

关于c# - 在 Orchard 中更新 ContentItem 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12897537/

相关文章:

C# @ 运算符(不适用于字符串文字)

c# - CheckedListBox 中的第二级

ASP.Net 控件出现在页面上,但不在该页面的用户控件中

c# - 部署 ascx 控件

asp.net - 有没有办法对ASP.NET开发Web服务器进行远程调用?

.net - 在 .NET Web API 中设置 JSON 序列化的最大深度

c# - 重新实现第 3 方 TCP Java 客户端

c# - Unity3d游戏收不到推送通知

c# - 错误 - 不允许连接字符串名称属性

.net - 当呈现大量 UI 控件时,如何在 WPF 中获得最佳性能?