我正在尝试构建一个包含可附加到内容类型的内容部分的模块,因此当创建新的内容项时,它会检索"最后id";从设置中取出int参数,为其添加1,并将其同时保存到新的Content Item和settings参数中。
所以,设置参数似乎工作得很好,我可以从管理菜单访问它,设置它的值并保存它。创建内容部分也可以很好地工作,我可以将该部分添加到现有的content Type,创建一个新的content Item,当我保存它时,它会进入注册的驱动程序的UpdateAsync方法。这是一切都变糟的时候。下面是ContentPart Driver中的UpdateAsync方法:
public override async Task<IDisplayResult> UpdateAsync(IncrementalPart model, IUpdateModel updater)
{
// Create IncrementalId only doesn't exist (IncrementalId is int?)
if (!model.IncrementalId.HasValue)
{
// Retrieve site settings
var incrementalSettings = _siteService.GetSiteSettingsAsync()
.GetAwaiter()
.GetResult();
// Get last Assigned Id, increment it, and set it to the model's IncrementalId
model.IncrementalId = ++incrementalSettings.As<IncrementalSettings>().LastId;
// Save model
await updater.TryUpdateModelAsync(
model,
Prefix,
t => t.IncrementalId
);
// Update and save the last assigned Id
incrementalSettings.Alter<IncrementalSettings>(nameof(IncrementalSettings), isett => isett.LastId = model.IncrementalId.GetValueOrDefault());
await _siteService.UpdateSiteSettingsAsync(incrementalSettings);
}
return Edit(model);
}
在编辑视图中,该部分没有任何实际可编辑的输入,因为它不应该手动编辑它,它应该在第一次保存内容项时创建,并在其上添加IncrementalPart,并且仅在此之后显示(仅显示分配的编号的<p>
,在其上添加<input type="hidden" asp-for="IncrementalId" />
以保留版本上的ID)。
这就是我的发现。当我尝试保存IncrementalId字段时,它不保存任何东西,并且模型的LastId值在调用await updater.TryUpdateModelAsync
后为空,因此当保存设置上的新LastId字段时,失败。
另一方面,如果我尝试保存设置之前更新ContentItem部分与它的新值,它保存lastd值ok,但随后它打破了UpdateAsync方法,所以我不能更新IncrementalId值之后。
我做错了什么?我基于这个模块在以前的一个我基于一个例子,这只是保存了一对值从编辑器和显示在相应的内容项页面上,它工作得很好,问题开始时,我添加检索/保存设置部分。
提前感谢。
UPDATE:所以,我已经设法从配置中检索值,在模型上更新它并保存它,但是,当我试图将最后分配的值保存回设置时,它只是打破了执行,当执行await _siteService.UpdateSiteSettingsAsync(incrementalSettings);
,不执行最终的return Edit(model);
。
这听起来像一个XY问题,尽管我认为问题是你想要得到的部分本身,然后改变字段。下面是我以编程方式添加内容项时使用的一些代码。
var salesPersonPart = salesPersonContentItem.As<Parts.SalesPerson>();
salesPersonPart.Alter<NumericField> (nameof(Parts.SalesPerson.SalesPersonId), field => field.Value = salesPerson.SalesPersonId.Value);
编辑:查看源代码的其他部分,重新编辑。看起来像这样的东西将工作更新网站设置。
var site = await _siteService.LoadSiteSettingsAsync();
site.Properties["IncrementalSettings"] = IncrementalSettings.Id;
await _siteService.UpdateSiteSettingsAsync(site);
UpdateSiteSettingsAsync的使用分散在整个源代码中,所以看看Orchard Core是如何做到的。