簡體   English   中英

使用 ContentPart 檢索設置參數,將其值保存在 ContentItem 上,並更新設置參數

[英]Using a ContentPart to retrieve a settings parameter, save it's value on a ContentItem, and updating the settings parameter

我正在嘗試構建一個包含可附加到內容類型的內容部分的模塊,因此當創建新的內容項時,它會從設置中檢索一個“last id”int 參數,向其添加 1,並將其同時保存到新的內容項和設置參數。

所以,設置參數似乎工作正常,我可以從管理菜單訪問它,設置它的值並保存它。 創建內容部分也很有效,我可以將該部分添加到現有的內容類型,創建一個新的內容項,當我保存它時,它會進入已注冊的驅動程序的 UpdateAsync 方法。 這就是一切都向南發展的時候。 這是來自 ContentPart 驅動程序的 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 字段時,它不會保存任何內容,調用await updater.TryUpdateModelAsync后模型的 LastId 值為 null,因此在設置中保存新的 LastId 字段時失敗。

另一方面,如果我嘗試在使用新值更新 ContentItem 部分之前保存設置,它可以保存 LastId 值,但隨后它會脫離 UpdateAsync 方法,因此之后我無法更新 IncrementalId 值。

我究竟做錯了什么? 我已經將這個模塊建立在我之前基於一個例子制作的模塊中,它只是從編輯器中保存了幾個值並將它們顯示在相應的內容項頁面上,並且它工作正常,當我添加檢索時問題開始了/保存設置部分。

提前致謝。

更新:所以,我已經設法從配置中檢索一個值,在 model 上更新它並保存它,但是,當我嘗試將最后分配的值保存回設置時,它只是中斷了執行,當await _siteService.UpdateSiteSettingsAsync(incrementalSettings); 執行完畢,最后return Edit(model); 不是。

這聽起來像是一個 XY 問題,盡管我認為問題在於您想要獲取零件本身,然后更改其上的字段。 下面是我在以編程方式添加 contentItems 時使用的一些代碼。

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 是如何做到的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM