C# Orchard计算字段不工作
我有一个部分,其中包含一个密码字段,我希望在数据库中对其进行加密。我用Orchard.Email作为灵感来做这件事,但我在使用ComputedField时遇到了一个问题 编辑零件时,ComputedField应负责加密。我编写了一个处理程序,该处理程序应该为ComputedField设置Getter和Setter委托,但是当到达驱动程序更新模型时,这些委托为NULL,因此我得到了一个NullReferenceException。但是,当我检索零件时,代理设置正确 我的代码: 部分 处理者 驾驶员 使现代化 我在处理程序上放置了一个断点,以查看何时调用它 第一次调用它时,属性具有数据库中记录的值,这很有意义。我修改了其中一个属性以查看会发生什么并跟踪对象。编辑:我在监视窗口中找到了makeobjectid选项,这告诉我同样的事情。 此时,将对具有我在步骤1中设置的属性值的项调用驱动程序,但ComputedField的Getter和Setter为NULL,因此发生异常,更新失败 在此之后,处理程序会在我的部件的另一个实例上再次被调用,我假设在数据库更新之后发生重定向。 我向我的part添加了一个额外属性,但没有添加到partrecord。如果我在断点到达处理程序时设置此属性的值,那么当我到达驱动程序时,该值不存在,因此我处理的部分对象与设置ComputedField的委托的部分对象不同,尽管底层记录对象是相同的。使用makeobjectid,我发现基本上是一样的:我正在处理TaskServerPart的三个实例。第二个实例是我的驱动程序要处理的实例,是唯一一个没有执行处理程序的实例C# Orchard计算字段不工作,c#,asp.net-mvc,orchardcms,C#,Asp.net Mvc,Orchardcms,我有一个部分,其中包含一个密码字段,我希望在数据库中对其进行加密。我用Orchard.Email作为灵感来做这件事,但我在使用ComputedField时遇到了一个问题 编辑零件时,ComputedField应负责加密。我编写了一个处理程序,该处理程序应该为ComputedField设置Getter和Setter委托,但是当到达驱动程序更新模型时,这些委托为NULL,因此我得到了一个NullReferenceException。但是,当我检索零件时,代理设置正确 我的代码: 部分 处理者 驾驶员
正在为最终位于驱动程序中的对象触发初始化和激活的事件,我是否应该使用其中一个事件而不是加载的事件 没有为发送给驱动程序的对象触发加载的事件。初始化的事件是,因此我使用该事件设置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);
});
}
}