Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Orchard计算字段不工作_C#_Asp.net Mvc_Orchardcms - Fatal编程技术网

C# Orchard计算字段不工作

C# Orchard计算字段不工作,c#,asp.net-mvc,orchardcms,C#,Asp.net Mvc,Orchardcms,我有一个部分,其中包含一个密码字段,我希望在数据库中对其进行加密。我用Orchard.Email作为灵感来做这件事,但我在使用ComputedField时遇到了一个问题 编辑零件时,ComputedField应负责加密。我编写了一个处理程序,该处理程序应该为ComputedField设置Getter和Setter委托,但是当到达驱动程序更新模型时,这些委托为NULL,因此我得到了一个NullReferenceException。但是,当我检索零件时,代理设置正确 我的代码: 部分 处理者 驾驶员

我有一个部分,其中包含一个密码字段,我希望在数据库中对其进行加密。我用Orchard.Email作为灵感来做这件事,但我在使用ComputedField时遇到了一个问题

编辑零件时,ComputedField应负责加密。我编写了一个处理程序,该处理程序应该为ComputedField设置Getter和Setter委托,但是当到达驱动程序更新模型时,这些委托为NULL,因此我得到了一个NullReferenceException。但是,当我检索零件时,代理设置正确

我的代码:

部分 处理者 驾驶员 使现代化 我在处理程序上放置了一个断点,以查看何时调用它

第一次调用它时,属性具有数据库中记录的值,这很有意义。我修改了其中一个属性以查看会发生什么并跟踪对象。编辑:我在监视窗口中找到了makeobjectid选项,这告诉我同样的事情。 此时,将对具有我在步骤1中设置的属性值的项调用驱动程序,但ComputedField的Getter和Setter为NULL,因此发生异常,更新失败 在此之后,处理程序会在我的部件的另一个实例上再次被调用,我假设在数据库更新之后发生重定向。 我向我的part添加了一个额外属性,但没有添加到partrecord。如果我在断点到达处理程序时设置此属性的值,那么当我到达驱动程序时,该值不存在,因此我处理的部分对象与设置ComputedField的委托的部分对象不同,尽管底层记录对象是相同的。使用makeobjectid,我发现基本上是一样的:我正在处理TaskServerPart的三个实例。第二个实例是我的驱动程序要处理的实例,是唯一一个没有执行处理程序的实例


正在为最终位于驱动程序中的对象触发初始化和激活的事件,我是否应该使用其中一个事件而不是加载的事件

没有为发送给驱动程序的对象触发加载的事件。初始化的事件是,因此我使用该事件设置ComputedField的Getter和Setter委托。

为什么密码甚至被加密?它们应该在存储时进行散列。我知道密码通常应该进行加密和散列,但这些是外部服务的服务帐户的密码。我不希望它们在Orchard数据库中是明文,但我需要在连接到上述服务时解密的密码。看起来应该可以。在调用驱动程序之前,您是否在处理程序中设置了断点以查看getter是否已初始化?当我在part.PasswordField.getter=>行上放置断点时,它已被调用,但发送给驱动程序的部分仍然没有getter或Setter。我用我的发现在问题上加了一些文字。
public class TaskServerPart : ContentPart<TaskServerPartRecord>
{
    private readonly ComputedField<string> _password = new ComputedField<string>();

    public ComputedField<string> PasswordField
    {
        get { return _password; }
    }

    public string Name
    {
        get { return Record.Name; }
        set { Record.Name = value; }
    }
    public string Domain
    {
        get { return Record.Domain; }
        set { Record.Domain = value; }
    }
    public string Username
    {
        get { return Record.Username; }
        set { Record.Username = value; }
    }

    public string Password
    {
        get { return _password.Value; }
        set { _password.Value = value; }
    }
} 
public class TaskServerPartRecord : ContentPartRecord
{
    public virtual string Name { get; set; }
    public virtual string Domain { get; set; }
    public virtual string Username { get; set; }
    public virtual string Password { get; set; }
}
public class TaskServerPartHandler : ContentHandler
{
    private readonly IEncryptionService _encryptionService;

    public TaskServerPartHandler(IRepository<TaskServerPartRecord> repository, IEncryptionService encryptionService)
    {
        _encryptionService = encryptionService;
        Logger = NullLogger.Instance;
        Filters.Add(new ActivatingFilter<TaskServerPart>("Site"));
        Filters.Add(StorageFilter.For(repository));
        OnLoaded<TaskServerPart>(LoadHandlers);
    }
    void LoadHandlers(LoadContentContext context, TaskServerPart part)
    {
        part.PasswordField.Getter(() =>
        {
            try
            {
                return String.IsNullOrWhiteSpace(part.Record.Password) ? String.Empty : Encoding.UTF8.GetString(_encryptionService.Decode(Convert.FromBase64String(part.Record.Password)));
            }
            catch
            {
                Logger.Error("The task server password could not be decrypted. It might be corrupted, try to reset it.");
                return null;
            }
        });

        part.PasswordField.Setter(value => part.Record.Password = String.IsNullOrWhiteSpace(value) ? String.Empty : Convert.ToBase64String(_encryptionService.Encode(Encoding.UTF8.GetBytes(value))));
    }
}
public class TaskServerDriver : ContentPartDriver<TaskServerPart>
{
    protected override string Prefix { get { return "TaskServer"; } }

    //GET
    protected override DriverResult Editor(
        TaskServerPart part, dynamic shapeHelper)
    {

        return ContentShape("Parts_TaskServer_Edit",
                            () => shapeHelper.EditorTemplate(
                                TemplateName: "Parts/TaskServer",
                                Model: part,
                                Prefix: Prefix))
            ;
    }
    //POST
    protected override DriverResult Editor(
        TaskServerPart part, IUpdateModel updater, dynamic shapeHelper) {
        return ContentShape("Parts_TaskServer_Edit", () => {
            var previousPassword = part.Password; // This fails, because the ComputedField has no Getter or Setter delegates
            updater.TryUpdateModel(part, Prefix, null, null);

            // restore password if the input is empty, meaning it has not been changed
            if (String.IsNullOrEmpty(part.Password)) {
                part.Password = previousPassword;
            }
            return shapeHelper.EditorTemplate(TemplateName: "Parts/TaskServer", Model: part, Prefix: Prefix);
        });
    }
}