Кратки отговори на въпросите, които се появяват, когато редакторът влезе в истинско приложение.
Ревизии и коментари в база данни
Хранилищата по подразбиране са в паметта; StorePath ги пази във файлове. За база данни реализирайте двата интерфейса. Хранилището получава идентификатора на документа и връща обикновени записи:
public sealed class EfRevisionStore(AppDbContext db) : IRteRevisionStore
{
public async Task<IReadOnlyList<RteRevision>> ListAsync(string documentId, CancellationToken cancellationToken = default) =>
await db.Revisions.Where(x => x.DocumentId == documentId).OrderByDescending(x => x.CreatedAt).ToListAsync(cancellationToken);
public async Task<RteRevision> SaveAsync(string documentId, string name, string html, string author, CancellationToken cancellationToken = default)
{
var revision = new RteRevision(Guid.NewGuid().ToString("N")[..12], documentId, name, html, author, DateTime.UtcNow);
db.Revisions.Add(revision);
await db.SaveChangesAsync(cancellationToken);
return revision;
}
// GetAsync, RenameAsync и DeleteAsync са по същия начин
}
builder.Services.AddScoped<IRteRevisionStore, EfRevisionStore>(); Регистрирайте хранилището преди или след AddRte; AddRte не заменя това, което вече има. IRteCommentStore и IRteAuditLog се правят по същия начин.
Защита на качването
Свържете папката с файлове с MapRteMedia(...).RequireAuthorization() вместо с междинния слой за статични файлове, сложете страницата зад [Authorize] и дръжте Upload.MaxFileSize малък. Вижте Настройки.
HTML за писма
var html = await editor.GetHtmlAsync();
var mail = EmailHtml.Create(html); EmailHtml вгражда стиловете и ползва таблици там, където пощенските програми ги изискват. Изпратете mail със свой компонент за поща.
Word файл със заглавна част и номера на страници
var options = new RteOptions { Docx = { HeaderText = "Договор", FooterText = "Поверително", PageNumbers = true, PageSize = "A4" } }; Менюто за износ и ExportDocxAsync ползват тези стойности.
PDF файлове от сървъра
Реализирайте IRtePdfExporter с изобразител, за който имате лиценз или който сами пускате (например браузър без прозорец или библиотека за PDF), и го регистрирайте. Менюто за износ тогава дава истински файл.
public sealed class MyPdfExporter : IRtePdfExporter
{
public async Task<byte[]> ExportAsync(string html, PdfOptions? options = null, CancellationToken cancellationToken = default)
{
var page = StaticRender.Render(html);
return await MyRenderer.ToPdfAsync(page, options?.PageSize == PdfPageSize.A4, cancellationToken);
}
} Известяване при споменаване
public sealed class MailMentionNotifier(IMailSender mail) : IRteMentionNotifier
{
public Task NotifyAsync(RteMention mention, CancellationToken cancellationToken = default) =>
mail.SendAsync(mention.PersonId, $"{mention.ByUserName} ви спомена", mention.Snippet, cancellationToken);
}
builder.Services.AddSingleton<IRteMentionNotifier, MailMentionNotifier>(); Човек се съобщава веднъж на страница, дори името да се вмъкне пак.
Смяна на бърз клавиш
var options = new RteOptions { Shortcuts = new() { ["strike"] = "Ctrl+Alt+S", ["underline"] = "" } }; Празен текст премахва комбинацията. Списъкът с всички комбинации е в диалога, който се отваря с Ctrl+/.
Показване на запазения HTML на страница
Покажете го с StaticRender.Render(html) и свържете _content/Rte/css/rte.css и стиловете на приставките, които ползвате (css/plugins/structure.css за съдържанието и бележките, css/plugins/table-tools.css за стиловете на таблици).
Готови ли сте да пробвате RayCraft Write?
Започнете 14-дневния пробен период, без карта.
Започнете 14-дневен пробен период