[{"data":1,"prerenderedAt":877},["ShallowReactive",2],{"blog-post-\u002Fblog\u002Fsitefinity-search-not-finding-text-inside-pdf-powerpoint-excel":3,"blog-nav-posts":21},{"id":4,"title":5,"author":6,"body":6,"content":7,"description":6,"extension":8,"image":6,"legacyUrl":6,"markdown":9,"meta":10,"navigation":9,"path":11,"publishedAt":12,"seo":13,"seoDescription":14,"slug":6,"stem":15,"tags":16,"updatedAt":6,"__hash__":20},"blog\u002Fblog\u002Fsitefinity-search-not-finding-text-inside-pdf-powerpoint-excel.json","Sitefinity search can't find the words inside your PDFs, PowerPoints or spreadsheets",null,"Search your site for a phrase you know is written inside a document and you get nothing back. Search the document's *title* and it comes up fine. Search the text *inside* it, zero results.\n\nSo here's what's going on. When Sitefinity indexes a file for search it doesn't read the file the way you do, it hands the file off to a small piece of code called a text extractor whose only job is to open that file type and hand back the words as plain text. Those words go into the search index. If no extractor exists for a file type, or the extractor blows up, the file still gets indexed but with an empty body. Title searchable, contents invisible.\n\nAnd nothing tells you. No error in the admin UI, no failed upload, no document that looks broken. Search just quietly stops finding things.\n\n## What Sitefinity actually ships\n\nExtractors for exactly five file types: PDF, DOCX, HTML, plain text and RTF. That's the whole list.\n\nSo PowerPoint files, Excel files and macro-enabled Word files (`.docm`) have NEVER had their contents indexed on any Sitefinity site, out of the box. And a chunk of your PDFs are probably failing too, for a completely separate reason, even though PDF is on the supported list.\n\nBoth are fixable because Sitefinity lets you register your own extractors through a config file. Four of them below plus the config that turns them on. If you just want the code, skip ahead.\n\n### Signs this is your problem\n\nSearch the Sitefinity error log for these. Any of them means documents are landing in the index with no text:\n\n- `MIME type is not supported` repeated once per document, per indexing pass. That's a file type with no extractor.\n- `InvalidStructureTreeException`, or a long Telerik stack trace mentioning `RichMedia`, on a PDF. That's the PDF problem below.\n- A reindex that runs forever and produces a searchable index where every document only matches on its filename.\n\nI found this the way most people probably do. A user insisted a document existed, search disagreed, and the document was sitting right there in the library.\n\n## What actually goes wrong\n\nTwo separate problems, and it took me a while to see they were separate.\n\nFirst one, whole formats have no extractor at all. PowerPoint is the big one. There is no PPTX extractor in Sitefinity, period, so in a library heavy with lecture slides a large fraction of the corpus is indexed title-only. Excel, same story. So is macro-enabled Word (`.docm`), which is more irritating because it's the same format as DOCX underneath. The stock extractor is registered against the DOCX MIME type, `.docm` announces a different one, so it just falls through. In the log that's your \"MIME type is not supported\" warning, once per document, per indexing pass.\n\nThe second one is subtler because PDF *does* have a stock extractor and it still fails. Decompiling it explains why:\n\n```csharp\n\u002F\u002F Sitefinity's DefaultPdfTextExtractor, paraphrased\nRadFixedDocument document = provider.Import(doc, timeout);\ndocument.DocumentUnhandledException += (s, e) => { e.Handled = true; };\n```\n\nLook at the order. The tolerant exception handler gets attached to the document *after* `Import()` has already returned. That handler catches problems during export, but a malformed structure tree or a `RichMedia` annotation throws during import, before there's a document to attach a handler to. So the handler does nothing.\n\nSymptom is an `InvalidStructureTreeException` stack trace in the log and a PDF in the index with an empty body. In a decade-old library of scanned handouts and PDFs with embedded video, that happens a LOT.\n\n## ITextExtractor\n\nSitefinity's extraction is properly pluggable, which is the only reason any of this is fixable. You write a class, name it in a config file, and Sitefinity starts calling it for that file type. `ITextExtractor` is three members:\n\n```csharp\npublic interface ITextExtractor\n{\n    string MimeType { get; }\n    void Initialize(string mimeType, NameValueCollection config);\n    void GetText(Stream doc, Stream text);\n}\n```\n\n`GetText` reads the file from `doc` and writes plain text to `text`. That's the whole contract.\n\nRegistration lives in `App_Data\u002FSitefinity\u002FConfiguration\u002FDocumentServiceConfig.config`, and the factory instantiates your type by name through `Activator.CreateInstance`:\n\n```xml\n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003CdocumentServiceConfig>\n\t\u003CextractorSettings>\n\t\t\u003Cadd mimeType=\"application\u002Fpdf\"\n\t\t     extractorType=\"Your.Namespace.PdfTextExtractor, Your.Assembly\" \u002F>\n\t\t\u003Cadd mimeType=\"application\u002Fvnd.openxmlformats-officedocument.presentationml.presentation\"\n\t\t     extractorType=\"Your.Namespace.PptxTextExtractor, Your.Assembly\" \u002F>\n\t\t\u003Cadd mimeType=\"application\u002Fvnd.ms-powerpoint.presentation.macroEnabled.12\"\n\t\t     extractorType=\"Your.Namespace.PptxTextExtractor, Your.Assembly\" \u002F>\n\t\t\u003Cadd mimeType=\"application\u002Fvnd.openxmlformats-officedocument.presentationml.slideshow\"\n\t\t     extractorType=\"Your.Namespace.PptxTextExtractor, Your.Assembly\" \u002F>\n\t\t\u003Cadd mimeType=\"application\u002Fvnd.openxmlformats-officedocument.spreadsheetml.sheet\"\n\t\t     extractorType=\"Your.Namespace.XlsxTextExtractor, Your.Assembly\" \u002F>\n\t\t\u003Cadd mimeType=\"application\u002Fvnd.ms-excel.sheet.macroEnabled.12\"\n\t\t     extractorType=\"Your.Namespace.XlsxTextExtractor, Your.Assembly\" \u002F>\n\t\t\u003Cadd mimeType=\"application\u002Fvnd.openxmlformats-officedocument.spreadsheetml.template\"\n\t\t     extractorType=\"Your.Namespace.XlsxTextExtractor, Your.Assembly\" \u002F>\n\t\t\u003Cadd mimeType=\"application\u002Fvnd.ms-word.document.macroEnabled.12\"\n\t\t     extractorType=\"Your.Namespace.WordTextExtractor, Your.Assembly\" \u002F>\n\t\u003C\u002FextractorSettings>\n\u003C\u002FdocumentServiceConfig>\n```\n\nWorth knowing before you go hunting for it: this merges, it does not replace. Adding entries here leaves the stock DOCX, HTML, plain and RTF registrations intact. A MIME type you name explicitly gets overridden by yours, everything else stays as shipped. I checked that against a live instance rather than trusting the docs, and it behaves.\n\nYou need one registration per MIME type even when a single class handles several, which is why PPTX, PPTM and PPSX all point at the same extractor. `Initialize` is where each instance learns which MIME type it got created for.\n\nThe thing that catches people out: registering an extractor does NOTHING to documents already in the index. Sitefinity extracts text at index time, not at search time, so existing documents keep whatever body text they had (usually none) until you rebuild the index from the search settings screen. Deploy the DLL, add the config, then reindex.\n\n## A shared helper for writing the text back out\n\nEvery extractor ends the same way, turning a `StringBuilder` into UTF-8 bytes on the output stream. There's a trap in doing that the obvious way.\n\n```csharp\ninternal static class TextExtractorOutput\n{\n    internal static void WriteUtf8(StringBuilder builder, Stream text)\n    {\n        \u002F\u002F Raw byte write instead of StreamWriter: disposing a writer would close the\n        \u002F\u002F caller's output stream before DocumentService reads it back\n        var bytes = Encoding.UTF8.GetBytes(builder.ToString());\n        text.Write(bytes, 0, bytes.Length);\n    }\n}\n```\n\nWrap the output in `using (var writer = new StreamWriter(text))` and you close the stream you were handed. Sitefinity then reads back from a closed stream, you get an empty body, and there's nothing obvious pointing at the cause. Write the bytes directly and leave the stream's lifetime to whoever created it.\n\n## Fixing PDFs that index with no text\n\nThe whole point here is attaching the tolerant handler to `ImportSettings` so it's live *during* import, then skipping the structure tree entirely. Text extraction never needs the structure tree (it's an accessibility and reading-order artifact) so `IgnoreMarkedContent` costs you nothing and removes the most common failure surface in one line.\n\n```csharp\nusing System;\nusing System.Collections.Specialized;\nusing System.IO;\nusing System.Text;\nusing Telerik.Sitefinity.Services.Documents;\nusing Telerik.Windows.Documents.Fixed.FormatProviders;\nusing Telerik.Windows.Documents.Fixed.FormatProviders.Pdf;\nusing Telerik.Windows.Documents.Fixed.FormatProviders.Text;\nusing Telerik.Windows.Documents.Fixed.Model;\n\npublic class PdfTextExtractor : ITextExtractor\n{\n    public string MimeType { get; private set; }\n\n    public void Initialize(string mimeType, NameValueCollection config)\n    {\n        this.MimeType = mimeType;\n    }\n\n    public void GetText(Stream doc, Stream text)\n    {\n        var provider = new PdfFormatProvider();\n        provider.ImportSettings.ReadingMode = ReadingMode.OnDemand;\n\n        \u002F\u002F Text extraction never reads the structure tree, and a malformed one is the\n        \u002F\u002F single most common import failure in legacy PDFs\n        provider.ImportSettings.IgnoreMarkedContent = true;\n\n        \u002F\u002F THE fix: subscribed on ImportSettings, so it is live during Import().\n        \u002F\u002F The stock extractor subscribes on the document afterwards, too late for\n        \u002F\u002F anything thrown while parsing.\n        provider.ImportSettings.DocumentUnhandledException += (sender, e) =>\n        {\n            e.Handled = true;\n        };\n\n        var timeout = TimeSpan.FromMinutes(5);\n\n        RadFixedDocument document = provider.Import(doc, timeout);\n        if (document == null)\n        {\n            return;\n        }\n\n        document.DocumentUnhandledException += (sender, e) =>\n        {\n            e.Handled = true;\n        };\n\n        var exporter = new TextFormatProvider();\n        var settings = new TextFormatProviderSettings(\"\\r\\n\", string.Empty);\n        var extracted = exporter.Export(document, settings, timeout);\n\n        TextExtractorOutput.WriteUtf8(new StringBuilder(extracted), text);\n    }\n}\n```\n\nCouple of notes if you're copying this. `ReadingMode` lives in `Telerik.Windows.Documents.Fixed.FormatProviders`, NOT the `.Pdf` namespace you'd expect, which is an easy twenty minutes lost to `CS0103`. And `ReadingMode.OnDemand` keeps page content lazy, which matters when the indexer is chewing through hundreds of files and you'd rather not hold every page of every PDF in memory at once.\n\nThis does not turn every broken PDF into clean text. What it fixes is the population of structurally damaged but genuinely textual PDFs that the stock extractor throws away wholesale. A PDF that's purely scanned images is a different case, and the next bit covers where that would hook in.\n\n### Where OCR would go, if you have a service for it\n\nSome PDFs have no text layer at all. Somebody scanned a paper handout, or printed to PDF from an image, and every page is a picture of words. There's nothing for `TextFormatProvider` to export, so extraction \"succeeds\" and returns an empty string. In the index that's indistinguishable from a file that failed.\n\nYou can detect it cheaply though. If a PDF has pages but almost no extracted characters, it's an image-only document. That's where an OCR service would slot in.\n\n```csharp\nprivate void Extract(Stream doc, Stream text)\n{\n    \u002F\u002F ... import and export exactly as above ...\n    var extracted = exporter.Export(document, settings, timeout);\n\n    \u002F\u002F A PDF with pages but effectively no characters is a scan. Roughly 20 chars\n    \u002F\u002F per page is well under any real document and well over an empty string.\n    var looksLikeAScan = document.Pages.Count > 0\n        && extracted.Trim().Length \u003C document.Pages.Count * 20;\n\n    if (looksLikeAScan)\n    {\n        \u002F\u002F extracted = OcrPages(document);\n    }\n\n    TextExtractorOutput.WriteUtf8(new StringBuilder(extracted), text);\n}\n\n\u002F\u002F Sketch only. Fill in with whichever OCR service you already pay for:\n\u002F\u002F Azure AI Document Intelligence, AWS Textract, Google Document AI, or a\n\u002F\u002F self-hosted Tesseract sidecar. They all take an image and return text.\n\u002F\u002F\n\u002F\u002F private string OcrPages(RadFixedDocument document)\n\u002F\u002F {\n\u002F\u002F     var builder = new StringBuilder();\n\u002F\u002F\n\u002F\u002F     foreach (var page in document.Pages)\n\u002F\u002F     {\n\u002F\u002F         \u002F\u002F Telerik can rasterize a page for you. The exact provider type moved\n\u002F\u002F         \u002F\u002F between versions (it is Skia-based in current releases), so check the\n\u002F\u002F         \u002F\u002F Document Processing docs for the one your assemblies actually ship.\n\u002F\u002F         byte[] pageImage;\n\u002F\u002F         using (var buffer = new MemoryStream())\n\u002F\u002F         {\n\u002F\u002F             \u002F\u002F imageProvider.Export(page, buffer);\n\u002F\u002F             pageImage = buffer.ToArray();\n\u002F\u002F         }\n\u002F\u002F\n\u002F\u002F         \u002F\u002F Your service call. Keep the per-page timeout short: this runs on the\n\u002F\u002F         \u002F\u002F indexing thread, and a stalled HTTP call holds up the whole reindex.\n\u002F\u002F         \u002F\u002F builder.AppendLine(ocrClient.Recognize(pageImage));\n\u002F\u002F     }\n\u002F\u002F\n\u002F\u002F     return builder.ToString();\n\u002F\u002F }\n```\n\nBefore you wire that up though, none of these are code problems.\n\nIt costs money per page, and a reindex processes every document again. A library with a few thousand scanned pages can turn one \"rebuild the index\" click into a real invoice. If you do this, cache the OCR result somewhere keyed by the document so a second reindex reads the cache instead of re-billing you.\n\nIt's slow. OCR is seconds per page against milliseconds for normal extraction, and it runs inline on the indexing thread. A few hundred scanned documents can stretch a reindex from minutes into hours. Doing the OCR in a separate background job and writing the result into a field the indexer reads is the saner architecture, it's just a bigger build.\n\nAnd it's fallible in a way normal extraction isn't. OCR on a bad scan produces plausible-looking wrong words, which then land in your search index as real terms. Usually still better than an empty document, but \"searchable\" and \"accurate\" have come apart at that point.\n\nI left this as a hook rather than an implementation. The image-only PDFs in the library were a small enough slice that the cost and complexity weren't worth it yet, and the detection line above at least tells you how big that slice actually is if you log it.\n\n## Indexing PowerPoint slides, including speaker notes\n\nNo Telerik dependency needed here. The OpenXML SDK (`DocumentFormat.OpenXml`) already ships with Sitefinity so this is free. PPTX, PPTM and PPSX are all ZIP packages of XML, and `PresentationDocument.Open` reads all three.\n\nThe useful trick is that all visible slide text lives in `a:t` elements no matter how deeply shapes, groups, tables and text boxes are nested. Walking `Descendants\u003CDrawing.Text>()` gets you everything without modeling the shape tree at all.\n\n```csharp\nusing System.Collections.Specialized;\nusing System.IO;\nusing System.Text;\nusing DocumentFormat.OpenXml.Packaging;\nusing Telerik.Sitefinity.Services.Documents;\n\npublic class PptxTextExtractor : ITextExtractor\n{\n    public string MimeType { get; private set; }\n\n    public void Initialize(string mimeType, NameValueCollection config)\n    {\n        \u002F\u002F One registration per mime; PresentationDocument also opens pptm and ppsx\n        this.MimeType = mimeType;\n    }\n\n    public void GetText(Stream doc, Stream text)\n    {\n        var builder = new StringBuilder();\n\n        using (var presentation = PresentationDocument.Open(doc, false))\n        {\n            var presentationPart = presentation.PresentationPart;\n            if (presentationPart == null)\n            {\n                return;\n            }\n\n            foreach (var slidePart in presentationPart.SlideParts)\n            {\n                \u002F\u002F a:t elements hold all visible slide text regardless of shape nesting\n                foreach (var textNode in slidePart.Slide.Descendants\u003CDocumentFormat.OpenXml.Drawing.Text>())\n                {\n                    builder.AppendLine(textNode.Text);\n                }\n\n                \u002F\u002F Speaker notes often carry the searchable substance of a lecture slide\n                var notes = slidePart.NotesSlidePart;\n                if (notes != null)\n                {\n                    foreach (var noteText in notes.NotesSlide.Descendants\u003CDocumentFormat.OpenXml.Drawing.Text>())\n                    {\n                        builder.AppendLine(noteText.Text);\n                    }\n                }\n            }\n        }\n\n        TextExtractorOutput.WriteUtf8(builder, text);\n    }\n}\n```\n\nSpeaker notes deserve their own mention. A slide will often read \"Management\" over a diagram while the notes pane holds the actual prose, the drug names and the caveats and the sentence somebody is going to search for six months later. Indexing slides but skipping notes throws away the most searchable text in the file, and it's four extra lines to include it.\n\n## Indexing Excel spreadsheets\n\nSpreadsheets keep their strings in a shared-string table rather than inline, so a naive walk over cells hands you a pile of integer indices. You have to dereference them.\n\n```csharp\nusing System.Collections.Generic;\nusing System.Collections.Specialized;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing DocumentFormat.OpenXml.Packaging;\nusing Telerik.Sitefinity.Services.Documents;\n\npublic class XlsxTextExtractor : ITextExtractor\n{\n    public string MimeType { get; private set; }\n\n    public void Initialize(string mimeType, NameValueCollection config)\n    {\n        \u002F\u002F One registration per mime; SpreadsheetDocument also opens xlsm and xltx\n        this.MimeType = mimeType;\n    }\n\n    public void GetText(Stream doc, Stream text)\n    {\n        var builder = new StringBuilder();\n\n        using (var spreadsheet = SpreadsheetDocument.Open(doc, false))\n        {\n            var workbookPart = spreadsheet.WorkbookPart;\n            if (workbookPart == null)\n            {\n                return;\n            }\n\n            \u002F\u002F Cell text mostly lives in the shared string table; inline strings are rare\n            var sharedStrings = new List\u003Cstring>();\n            var sharedStringPart = workbookPart.SharedStringTablePart;\n            if (sharedStringPart != null)\n            {\n                sharedStrings = sharedStringPart.SharedStringTable\n                    .Elements\u003CDocumentFormat.OpenXml.Spreadsheet.SharedStringItem>()\n                    .Select(item => item.InnerText)\n                    .ToList();\n            }\n\n            foreach (var sheetPart in workbookPart.WorksheetParts)\n            {\n                foreach (var cell in sheetPart.Worksheet.Descendants\u003CDocumentFormat.OpenXml.Spreadsheet.Cell>())\n                {\n                    if (cell.CellValue == null)\n                    {\n                        continue;\n                    }\n\n                    var value = cell.CellValue.InnerText;\n                    if (cell.DataType != null && cell.DataType.Value == DocumentFormat.OpenXml.Spreadsheet.CellValues.SharedString)\n                    {\n                        int index;\n                        if (int.TryParse(value, out index) && index >= 0 && index \u003C sharedStrings.Count)\n                        {\n                            builder.AppendLine(sharedStrings[index]);\n                        }\n                    }\n                    else\n                    {\n                        builder.AppendLine(value);\n                    }\n                }\n            }\n        }\n\n        TextExtractorOutput.WriteUtf8(builder, text);\n    }\n}\n```\n\nThat bounds check on the index isn't ceremony. A corrupt or hand-generated workbook can carry a shared-string index past the end of the table, and an unguarded lookup throws in the middle of indexing over a value nobody would have searched for anyway. Skip the cell, keep the document.\n\n## Indexing macro-enabled Word files (.docm)\n\nSmallest of the four and the most purely bureaucratic. A `.docm` file is DOCX with macros, the content is identical. It only misses out because of the MIME type mismatch from earlier.\n\n```csharp\nusing System.Collections.Specialized;\nusing System.IO;\nusing System.Text;\nusing DocumentFormat.OpenXml.Packaging;\nusing Telerik.Sitefinity.Services.Documents;\n\npublic class WordTextExtractor : ITextExtractor\n{\n    public string MimeType { get; private set; }\n\n    public void Initialize(string mimeType, NameValueCollection config)\n    {\n        this.MimeType = mimeType;\n    }\n\n    public void GetText(Stream doc, Stream text)\n    {\n        var builder = new StringBuilder();\n\n        using (var word = WordprocessingDocument.Open(doc, false))\n        {\n            var body = word.MainDocumentPart?.Document?.Body;\n            if (body == null)\n            {\n                return;\n            }\n\n            foreach (var paragraph in body.Descendants\u003CDocumentFormat.OpenXml.Wordprocessing.Paragraph>())\n            {\n                builder.AppendLine(paragraph.InnerText);\n            }\n        }\n\n        TextExtractorOutput.WriteUtf8(builder, text);\n    }\n}\n```\n\nLeave plain `.docx` with the built-in extractor. No reason to take ownership of a format Sitefinity already handles.\n\n## Failure behavior matters more than the parsing\n\nSitefinity runs inbound publishing pipes through a helper that amounts to `try { action(item); } catch { Log.Error(...); }` with no rethrow. Which keeps one bad file from killing an entire reindex, fair enough. The cost is that an exception in the indexing path makes the document silently disappear from the index. No error page, no failed job, just a document that is no longer findable and a line in a log file nobody reads.\n\nSo the rule for extractor code is that a failure should cost you one document's body text. Never the document itself, and never the run.\n\nDon't let an exception escape `GetText` if you can avoid it. Catch it, report it somewhere you actually look, and return with an empty output stream so the document still gets indexed by title and metadata.\n\nReport to your error tracker rather than only the log file. I route extractor failures to Sentry with the MIME type and stream length attached. One caveat worth designing around: `GetText` only receives a stream, so the document ID lives in the caller and isn't available to you. If you need to identify the specific file, match on timestamp against the log.\n\nAnd cap the reporting. A systemic problem during a full reindex fails once per document, and twenty thousand documents means twenty thousand identical events, which is exactly how a useful signal ends up muted as noise. I cap at ten per extractor per app domain and carry a counter in the payload so the real scale stays visible.\n\nThat last one turned out to be the biggest quality-of-life win of the whole exercise. Before, a reindex dumped a sixty-plus-line Telerik stack trace into the error log for every failing PDF, hundreds of times over, burying anything else happening on the site. Same situation now produces ten events with a count attached, and a log you can still read.\n\n## After deploying it\n\nFormats that had no extractor at all now index their contents: slides plus speaker notes, spreadsheet cells, macro-enabled documents. The \"MIME type is not supported\" warnings stopped, because those MIME types are now supported.\n\nOn the PDF side, the structurally broken legacy files that the stock extractor gave up on during import come back with text. Not all of them, image-only scans still need OCR, but the ones whose only sin was a malformed structure tree or a `RichMedia` annotation are fine now.\n\nIt's maybe 300 lines total and most of that is boilerplate around four small parsers. Almost none of the time went into the parsing.\n","json",true,{},"\u002Fblog\u002Fsitefinity-search-not-finding-text-inside-pdf-powerpoint-excel","2026-07-14T09:20:00",{"title":5},"Sitefinity ships text extractors for only five file types, so PowerPoint, Excel and .docm contents are never indexed. Here are four that fix it.","blog\u002Fsitefinity-search-not-finding-text-inside-pdf-powerpoint-excel",[17,18,19],"Tutorial","Fixes","Sitefinity","Irmz9M10Mk67M4z-syWhSq65rmukMI18Ez1k4yPYDs4",[22,28,30,36,41,46,51,56,61,66,71,76,81,86,91,96,101,106,112,117,123,128,134,139,144,149,154,159,164,169,174,179,184,189,194,199,205,210,215,220,225,230,235,240,245,250,255,261,266,271,276,281,286,291,296,301,306,311,316,321,326,331,336,341,346,351,356,361,366,371,376,381,386,391,396,401,406,411,416,421,426,431,436,441,446,451,456,461,466,471,476,481,486,491,496,501,506,511,516,521,526,531,536,541,546,551,556,561,566,571,576,581,586,591,596,601,606,611,616,621,626,631,636,641,646,651,656,661,666,671,676,681,686,691,697,702,707,712,717,722,727,732,737,742,747,752,757,762,767,772,777,782,787,792,797,802,807,812,817,822,827,832,837,842,847,852,857,862,867,872],{"path":23,"title":24,"publishedAt":25,"tags":26},"\u002Fblog\u002Ffixing-the-sitefinity-page-editor-drag-and-drop-experience","Why the Sitefinity page editor jumps when you drag a widget","2026-08-05T10:45:00",[17,18,19,27],"Rants",{"path":11,"title":5,"publishedAt":12,"tags":29},[17,18,19],{"path":31,"title":32,"publishedAt":33,"tags":34},"\u002Fblog\u002Fvue-3-vite-8-tailwind-css-v4-on-sitefinity-cms-complete-setup-guide-with-code-splitting","Vue 3 + Vite 8 + Tailwind CSS v4 on Sitefinity CMS: Complete Setup Guide with Code Splitting","2026-03-19T19:44:00",[17,35],"VueJs",{"path":37,"title":38,"publishedAt":39,"tags":40},"\u002Fblog\u002Fsitefinity-mcp-server-ai-tools-for-your-cms","I Built an MCP Server for Sitefinity","2026-02-12T10:00:00.000Z",[17,19],{"path":42,"title":43,"publishedAt":44,"tags":45},"\u002Fblog\u002Fsitefinity-discover-formresponse-metafields-for-custom-export","Sitefinity Discover FormResponse MetaFields for custom export","2026-01-16T09:12:00.000Z",[17,19],{"path":47,"title":48,"publishedAt":49,"tags":50},"\u002Fblog\u002Fdirect-sql-access-to-sitefinity-dynamic-content-for-easy-poco-mapping","Direct SQL Access to Sitefinity Dynamic Content for Easy POCO Mapping","2025-08-15T14:28:00",[19],{"path":52,"title":53,"publishedAt":54,"tags":55},"\u002Fblog\u002Fkendoui-pricing-is-disjointed-from-reality-and-other-things","KendoUI pricing is disjointed from reality, and other things","2025-08-05T14:59:00",[27],{"path":57,"title":58,"publishedAt":59,"tags":60},"\u002Fblog\u002Fautomatically-correcting-semantic-headings-for-cms-content","Automatically Correcting Semantic Headings for CMS Content","2025-07-18T09:00:00",[],{"path":62,"title":63,"publishedAt":64,"tags":65},"\u002Fblog\u002Feasier-faster-sitefinity-contentlocations-api","Easier, Sitefinity ContentLocations API","2025-06-03T10:32:00",[17,19],{"path":67,"title":68,"publishedAt":69,"tags":70},"\u002Fblog\u002Fshowing-instructions-sitefinity-autogenerated-designers","Instructions for Sitefinity Autogenerated Designers","2025-03-10T12:04:58.788Z",[17,19],{"path":72,"title":73,"publishedAt":74,"tags":75},"\u002Fblog\u002Fnativescript-ios-simulator-laravel-api-error-the-certificate-for-this-server-is-invalid","Nativescript iOS Simulator Laravel API Error: The certificate for this server is invalid","2024-12-19T14:26:15.640Z",[17,18],{"path":77,"title":78,"publishedAt":79,"tags":80},"\u002Fblog\u002Finstall-unsupported-visual-studio-2022-extension-into-vs2022-arm","This extension is not installable on any currently installed products Visual Studio 2022 ARM","2024-02-29T00:52:53.302Z",[17,18],{"path":82,"title":83,"publishedAt":84,"tags":85},"\u002Fblog\u002Frunning-sitefinity-on-apple-silicon-with-parallels","Running Sitefinity on Apple Silicon with Parallels","2023-11-23T14:59:55.098Z",[17],{"path":87,"title":88,"publishedAt":89,"tags":90},"\u002Fblog\u002Fdefining-which-controller-action-or-json-route-to-post-to-when-theres-more-than-one-on-the-page","Defining which Controller Action or Json route to POST to when there's more than one on the page","2023-08-11T18:56:52.701Z",[17,19,18],{"path":92,"title":93,"publishedAt":94,"tags":95},"\u002Fblog\u002Ftimezone-conversion-from-sitefinity-odata-event-api-service","Timezone conversion from Sitefinity OData Event API Service","2023-04-13T19:08:48.349Z",[17,19],{"path":97,"title":98,"publishedAt":99,"tags":100},"\u002Fblog\u002Fhow-to-get-the-saved-controller-properties-for-a-widget-on-a-page","How to get the saved Controller properties for a widget on a page","2023-04-04T16:01:53.545Z",[17,19],{"path":102,"title":103,"publishedAt":104,"tags":105},"\u002Fblog\u002Funable-to-directly-link-to-a-backend-advanced-configuration-section","Unable to directly link to a backend Advanced Configuration Section","2023-03-17T16:44:12.109Z",[17,19],{"path":107,"title":108,"publishedAt":109,"tags":110},"\u002Fblog\u002Fhow-to-join-a-party-with-xbox-xcloud-and-not-get-the-ms-xbl-multiplayer-link-error","How to join a party with XBox xCloud and not get the ms-xbl-multiplayer link error","2022-12-27T21:48:01.644Z",[17,111],"Other",{"path":113,"title":114,"publishedAt":115,"tags":116},"\u002Fblog\u002Fauditing-page-permissions","Auditing page permissions","2022-11-16T14:07:18.061Z",[17,19],{"path":118,"title":119,"publishedAt":120,"tags":121},"\u002Fblog\u002Flaravel-is-better-than-sitefinity-for-small-projects","Laravel is better than Sitefinity for small projects","2022-08-19T14:20:29.093Z",[122,19],"Reviews",{"path":124,"title":125,"publishedAt":126,"tags":127},"\u002Fblog\u002Fadding-a-class-to-the-body-tag-when-a-widget-is-on-the-page","Adding a class to HTML when a custom widget is on the page","2022-04-07T11:42:59.789Z",[17,19],{"path":129,"title":130,"publishedAt":131,"tags":132},"\u002Fblog\u002Fcustom-function-validation-in-kendoui-spreadsheet","Custom Function Validation in KendoUI Spreadsheet","2021-12-08T14:20:23.396Z",[17,133],"KendoUI",{"path":135,"title":136,"publishedAt":137,"tags":138},"\u002Fblog\u002Fadding-telerik-reporting-v15-to-sitefinity-in-2021","Adding Telerik Reporting v15+ to Sitefinity in 2021","2021-11-26T16:36:51.711Z",[17,19,35,133],{"path":140,"title":141,"publishedAt":142,"tags":143},"\u002Fblog\u002Fuse-vuejs-with-sitefinity","Use VueJs with Sitefinity","2021-11-16T14:15:04.251Z",[17,35,19],{"path":145,"title":146,"publishedAt":147,"tags":148},"\u002Fblog\u002Fvuejs-upload-input-though-a-regular-form-postback","VueJs Upload Input though a regular form postback","2021-09-09T12:14:01.621Z",[17,35],{"path":150,"title":151,"publishedAt":152,"tags":153},"\u002Fblog\u002Fdownloading-a-file-through-a-login-page","Downloading a file through a login page","2021-08-05T14:27:59.581Z",[17,19],{"path":155,"title":156,"publishedAt":157,"tags":158},"\u002Fblog\u002Fsitefinity-anonymous-form-submissions","Sitefinity anonymous form submissions","2021-06-15T19:10:54.296Z",[17,19],{"path":160,"title":161,"publishedAt":162,"tags":163},"\u002Fblog\u002Fadding-metaproperties-like-opengraph-to-sitefinity-actionresult-routes","Adding MetaProperties like OpenGraph to ActionResult routes","2021-04-06T12:40:46.905Z",[17,19],{"path":165,"title":166,"publishedAt":167,"tags":168},"\u002Fblog\u002Fviewing-whats-in-your-sitefinity-sitemap","Viewing what's in your Sitefinity Sitemap","2021-03-25T13:41:01.367Z",[17,19],{"path":170,"title":171,"publishedAt":172,"tags":173},"\u002Fblog\u002Fsitefinity-controller-actionresult-not-routing-properly","Sitefinity Controller ActionResult not routing properly","2021-03-19T18:03:13.041Z",[18,19],{"path":175,"title":176,"publishedAt":177,"tags":178},"\u002Fblog\u002Fblocking-bottraffic-or-trafficbot-url-requests-from-jacking-up-your-google-analytics","Blocking bottraffic or trafficbot url requests from jacking up your Google Analytics","2021-02-04T19:15:06.784Z",[17,19],{"path":180,"title":181,"publishedAt":182,"tags":183},"\u002Fblog\u002Fcreate-a-scheduled-task-cron-job-in-sitefinity","Create a Scheduled Task\\Cron job in Sitefinity","2021-01-22T15:05:14.948Z",[17,19],{"path":185,"title":186,"publishedAt":187,"tags":188},"\u002Fblog\u002Fsitefinity-signing-certificate-not-configured","Sitefinity Signing certificate not configured","2021-01-08T13:44:06.598Z",[17,19],{"path":190,"title":191,"publishedAt":192,"tags":193},"\u002Fblog\u002Fbinding-sitefinity-form-field-to-remote-data","Populating a Sitefinity Form Field from a remote API","2020-09-29T18:03:07.941Z",[17,19],{"path":195,"title":196,"publishedAt":197,"tags":198},"\u002Fblog\u002Fexclude-pages-from-netlifys-sitemap-plugin","Exclude pages from netlifys sitemap plugin","2020-08-19T23:01:18.599Z",[17,35],{"path":200,"title":201,"publishedAt":202,"tags":203},"\u002Fblog\u002Ftailwindcss-current-responsive-size","Showing your Tailwindcss Responsive Breakpoint","2020-08-05T09:35:32.000Z",[17,204],"TailwindCss",{"path":206,"title":207,"publishedAt":208,"tags":209},"\u002Fblog\u002Fsitefinity-saml2-login","Configure Sitefinity with SAML2 Authentication","2020-07-06T23:27:17.9000000Z",[17],{"path":211,"title":212,"publishedAt":213,"tags":214},"\u002Fblog\u002Fdynamically-navigate-content-from-list-to-detail","Navigating from List to Detail no hardcoded routes","2020-06-23T19:43:37.8430000Z",[17,19],{"path":216,"title":217,"publishedAt":218,"tags":219},"\u002Fblog\u002Fswapping-sitefinity-page-for-a-new-version","Replacing a Sitefinity Page with a new version","2020-06-16T21:42:27.6300000Z",[17],{"path":221,"title":222,"publishedAt":223,"tags":224},"\u002Fblog\u002Fwhy-isnt-sitefinity-serving-me-new-versions-of-an-updated-file","Sitefinity serving old versions of files","2020-06-16T16:07:49.1170000Z",[17,18,19],{"path":226,"title":227,"publishedAt":228,"tags":229},"\u002Fblog\u002Fopen-facebook-app-to-someones-profile-nativescript","Open facebook app to someones profile","2020-05-12T19:22:56.8530000Z",[17,18],{"path":231,"title":232,"publishedAt":233,"tags":234},"\u002Fblog\u002Fsitefinity-12.2-performance-review","Sitefinity 12.2 Performance Review","2019-11-06T18:09:20.4800000Z",[122,19],{"path":236,"title":237,"publishedAt":238,"tags":239},"\u002Fblog\u002Femailtextfield-for-authenticated-users","EmailTextField for Authenticated users","2019-10-30T19:31:38.8500000Z",[17,19,18],{"path":241,"title":242,"publishedAt":243,"tags":244},"\u002Fblog\u002Fcustomize-toolbox-widget-icons","Changing the look of toolbox widget icons","2019-06-11T17:31:14.4030000Z",[17,19],{"path":246,"title":247,"publishedAt":248,"tags":249},"\u002Fblog\u002Fpersonalization-issues-with-sitefinity-api","Personalization Problems with the Sitefinity API","2019-05-22T18:10:36.7270000Z",[27],{"path":251,"title":252,"publishedAt":253,"tags":254},"\u002Fblog\u002Ffiguring-out-the-logged-in-users-identity-provider","Finding out which provider a user logged in with","2019-03-29T17:43:26.0230000Z",[17,19],{"path":256,"title":257,"publishedAt":258,"tags":259},"\u002Fblog\u002Fnew-sitefinity-twitter-feed-widget-service","New Sitefinity Twitter Feed\\Widget\\Service","2018-12-19T16:10:43.5300000Z",[19,260],"News",{"path":262,"title":263,"publishedAt":264,"tags":265},"\u002Fblog\u002Fmacbook-stuck-keys-or-laggy-mouse","Macbook stuck keys or laggy mouse","2018-09-19T16:18:09.4530000Z",[27],{"path":267,"title":268,"publishedAt":269,"tags":270},"\u002Fblog\u002Ftesting-functionality-with-cypress-io","Testing functionality with cypress.io","2018-07-20T18:26:08.8030000Z",[122],{"path":272,"title":273,"publishedAt":274,"tags":275},"\u002Fblog\u002Fduplicate-urlname-popup","Duplicate urlname popup fix using custom script","2018-03-01T16:26:25.7600000Z",[17,19,18],{"path":277,"title":278,"publishedAt":279,"tags":280},"\u002Fblog\u002Ffinding-sitefinity-widgets-on-a-page","Finding sitefinity widgets on a page","2018-02-27T20:10:07.0070000Z",[17,19],{"path":282,"title":283,"publishedAt":284,"tags":285},"\u002Fblog\u002Fangular-widgets-in-sitefinity","Angular widgets in Sitefinity","2018-01-31T15:15:17.5970000Z",[17,19],{"path":287,"title":288,"publishedAt":289,"tags":290},"\u002Fblog\u002Fsocial-logout-in-sitefinity","Social Logout in Sitefinity","2017-12-20T20:16:51.7770000Z",[17,19],{"path":292,"title":293,"publishedAt":294,"tags":295},"\u002Fblog\u002Ffree-ssl-in-sitefinity-with-letsencrypt","Free SSL in Sitefinity with LetsEncrypt","2017-11-21T19:29:32.9030000Z",[17,19],{"path":297,"title":298,"publishedAt":299,"tags":300},"\u002Fblog\u002Fsupercharge-sitefinity-load-times-with-roslyn","Supercharge Sitefinity load times with Roslyn","2017-10-01T03:41:15.0500000Z",[17,19],{"path":302,"title":303,"publishedAt":304,"tags":305},"\u002Fblog\u002Fsitefinity-forms-popup-template","Sitefinity forms popup template","2017-09-08T15:40:50.8700000Z",[17,19],{"path":307,"title":308,"publishedAt":309,"tags":310},"\u002Fblog\u002Fhelp-my-pageeditor-is-broken","Help! My PageEditor is broken!","2017-08-25T15:59:40.1370000Z",[17,19,18],{"path":312,"title":313,"publishedAt":314,"tags":315},"\u002Fblog\u002Fsitefinity-10.1-and-development-load-times","Sitefinity 10.1 and Development Load times","2017-07-18T13:47:11.4130000Z",[17,19],{"path":317,"title":318,"publishedAt":319,"tags":320},"\u002Fblog\u002Fremote-certificate-is-invalid","Remote certificate is invalid error, self sign a cert","2017-05-15T17:00:49.7670000Z",[17,19],{"path":322,"title":323,"publishedAt":324,"tags":325},"\u002Fblog\u002Ffeather-mvc-bootstrap-dropdown-navigation-template","Feather MVC bootstrap dropdown navigation template","2017-03-20T14:41:07.4270000Z",[17,19],{"path":327,"title":328,"publishedAt":329,"tags":330},"\u002Fblog\u002Fkendo-grid-update-cannot-read-property-data-of-undefined","Kendo Grid: cannot read property data of undefined","2017-01-27T15:17:03.1300000Z",[18,133,17],{"path":332,"title":333,"publishedAt":334,"tags":335},"\u002Fblog\u002Fsanitize-pasted-content-sitefinity-editor","Sanitize pasted content in the Sitefinity Editor","2017-01-09T18:08:14.8200000Z",[17,19,133],{"path":337,"title":338,"publishedAt":339,"tags":340},"\u002Fblog\u002Fhardcoded-taxa-content-filtering-assumptions","Sitefinity Taxa Filtering hardcoded to only use AND","2016-11-15T20:59:39.7570000Z",[17,27,19],{"path":342,"title":343,"publishedAt":344,"tags":345},"\u002Fblog\u002Fdefine-markup-for-content-linked-in-the-wysiwyg-editors","Set rendered html for images and docs in the editor","2016-11-05T23:17:07.0200000Z",[17,19,133,18],{"path":347,"title":348,"publishedAt":349,"tags":350},"\u002Fblog\u002Fcustomizing-forms-column-names-with-feather-mvc-forms","Customizing Sitefinity MVC Form Column Names","2016-10-04T14:39:51.8670000Z",[17,19,18],{"path":352,"title":353,"publishedAt":354,"tags":355},"\u002Fblog\u002Feasy-css-setup-for-tablet-and-phone-nativescript","Easy Css Setup for Tablet and Phone NativeScript","2016-07-12T23:11:14.4400000Z",[17],{"path":357,"title":358,"publishedAt":359,"tags":360},"\u002Fblog\u002Fnew-widget-document-folder-list","New Widget - Document Folder List","2016-05-27T18:03:10.6400000Z",[260,19],{"path":362,"title":363,"publishedAt":364,"tags":365},"\u002Fblog\u002Ffinding-mvc-widgets-in-your-page-designer","Finding MVC widgets in your page designer","2016-05-19T18:31:34.6800000Z",[17,19],{"path":367,"title":368,"publishedAt":369,"tags":370},"\u002Fblog\u002Ffixing-cached-ldap-roles","Fixing Cached Ldap Roles","2016-03-03T17:28:53.9230000Z",[17,19,27],{"path":372,"title":373,"publishedAt":374,"tags":375},"\u002Fblog\u002Fdetect-indexing-in-your-feather-view","Detect Indexing in your feather view","2015-10-14T15:15:38.4170000Z",[17,19],{"path":377,"title":378,"publishedAt":379,"tags":380},"\u002Fblog\u002Fhybrid-feather-resource-package-loading","Loading a specific Feather Template in Hybrid Mode","2015-10-07T18:46:30.0970000Z",[19,17],{"path":382,"title":383,"publishedAt":384,"tags":385},"\u002Fblog\u002Fsitefinity-8-2-beta-announcement","Sitefinity 8.2 Beta Announcement","2015-09-25T15:07:32.1470000Z",[260,19],{"path":387,"title":388,"publishedAt":389,"tags":390},"\u002Fblog\u002Forganizing-mvc-feather-widgets-in-your-toolbox","Organizing widgets in your Sitefinity Page Editor","2015-03-27T18:21:23.3530000Z",[17,19],{"path":392,"title":393,"publishedAt":394,"tags":395},"\u002Fblog\u002Fhow-to-stop-radlistview-bloating-your-page","Prevent RadListView bloating your page with HTML","2015-03-05T16:43:55.1670000Z",[17,19],{"path":397,"title":398,"publishedAt":399,"tags":400},"\u002Fblog\u002Fsitefinity-feather-gets-list-mode-right","Sitefinity Feather gets list mode right","2015-02-06T18:07:09.5700000Z",[122,19],{"path":402,"title":403,"publishedAt":404,"tags":405},"\u002Fblog\u002Fwrite-fast-javascript-on-your-live-site","Rapidly write and debug javascript in a page","2014-12-22T17:12:32.9500000Z",[17],{"path":407,"title":408,"publishedAt":409,"tags":410},"\u002Fblog\u002Fis-sitefinity-not-evangalizable","Is Sitefinity not evangalizable?","2014-11-17T19:13:59.5470000Z",[27,19],{"path":412,"title":413,"publishedAt":414,"tags":415},"\u002Fblog\u002Fallow-users-to-download-media-through-login-without-a-401","Redirect to protected document after login","2014-11-11T13:31:31.6000000Z",[17,19],{"path":417,"title":418,"publishedAt":419,"tags":420},"\u002Fblog\u002Fsingle-hierarchical-to-new-multi-widget-system","Sitefinity 7.1s new multi-widget module system","2014-08-15T18:37:43.6870000Z",[17,19],{"path":422,"title":423,"publishedAt":424,"tags":425},"\u002Fblog\u002Fexport-html-or-content-to-pdf-word-etc-with-sitefinity","Export Sitefinity Content to Pdf or MSWord","2014-07-30T14:57:17.5270000Z",[17,19],{"path":427,"title":428,"publishedAt":429,"tags":430},"\u002Fblog\u002Fmvc-widgets-in-webforms-templates","MVC Widgets in your Sitefinity WebForms Templates","2014-05-16T17:40:16.2670000Z",[17,19],{"path":432,"title":433,"publishedAt":434,"tags":435},"\u002Fblog\u002Fappending-your-domain-or-sitename-to-the-page-title","Append text to a Sitefinity Page Title","2014-04-28T15:27:58.1000000Z",[17,19],{"path":437,"title":438,"publishedAt":439,"tags":440},"\u002Fblog\u002Fkendoui-sortable-widget-with-mvvm","KendoUI Sortable Widget with MVVM","2014-04-22T14:56:38.5500000Z",[17,133],{"path":442,"title":443,"publishedAt":444,"tags":445},"\u002Fblog\u002Fwhy-i-dont-like-my-surface-2s","Why I don't like my Surface 2","2014-04-14T20:27:33.7100000Z",[122],{"path":447,"title":448,"publishedAt":449,"tags":450},"\u002Fblog\u002Fsitefinity-7-review","Sitefinity 7 Review","2014-04-10T19:30:03.7130000Z",[122,19],{"path":452,"title":453,"publishedAt":454,"tags":455},"\u002Fblog\u002Fcustomize-custom-sitefinity-toolbox-elements","Customize Custom Sitefinity Toolbox Elements","2014-01-26T18:49:52.6670000Z",[17,19],{"path":457,"title":458,"publishedAt":459,"tags":460},"\u002Fblog\u002Fsitefinity-cache","Sitefinity Cache","2014-01-07T11:55:17.3500000Z",[17,19],{"path":462,"title":463,"publishedAt":464,"tags":465},"\u002Fblog\u002Fmake-your-loginwidget-react-to-a-clientside-login","Make your LoginWidget react to a clientside login","2013-11-27T19:09:05.1370000Z",[19,17],{"path":467,"title":468,"publishedAt":469,"tags":470},"\u002Fblog\u002Fshow-alt-text-in-the-images-grid","Show Alt Text in the Sitefinity Images Module Grid","2013-11-25T21:09:22.6670000Z",[17,19],{"path":472,"title":473,"publishedAt":474,"tags":475},"\u002Fblog\u002Fdefouting-the-new-61-sitefinity-nav-menu","Defouting the new 6.1 Sitefinity Nav Menu","2013-08-08T14:48:59.7730000Z",[17,19,133,18],{"path":477,"title":478,"publishedAt":479,"tags":480},"\u002Fblog\u002Fhow-precompiled-templates-work","How PreCompiled templates work","2013-07-23T12:19:15.9430000Z",[17,19],{"path":482,"title":483,"publishedAt":484,"tags":485},"\u002Fblog\u002Fuse-sitefinity-layout-controls-without-drag-drop","Use Sitefinity Layout Controls without Drag\\Drop","2013-07-01T04:54:44.9700000Z",[17,19],{"path":487,"title":488,"publishedAt":489,"tags":490},"\u002Fblog\u002Fsitefinity-twitter-is-dead","Sitefinity Twitter is dead","2013-06-18T12:38:36.6230000Z",[260,19],{"path":492,"title":493,"publishedAt":494,"tags":495},"\u002Fblog\u002Fintroducing-the-scriptstyle-widget","Introducing the ScriptStyle Widget","2013-05-30T17:36:48.8200000Z",[19,17],{"path":497,"title":498,"publishedAt":499,"tags":500},"\u002Fblog\u002Fcontentview-master-detail-confusion","Sitefinitys ContentView can be an ass#$%@ sometimes","2013-04-23T15:25:51.2300000Z",[27,19],{"path":502,"title":503,"publishedAt":504,"tags":505},"\u002Fblog\u002Ffixing-ugly-hierarchical-dynamiccontent-urls","Fixing Ugly Hierarchical DynamicContent Urls","2013-04-02T17:51:04.4430000Z",[17,19],{"path":507,"title":508,"publishedAt":509,"tags":510},"\u002Fblog\u002Fmyth-of-the-sitefinity-jquery-double-load","Myth of the Sitefinity jQuery Double Load","2013-02-19T13:59:11.9570000Z",[27,19],{"path":512,"title":513,"publishedAt":514,"tags":515},"\u002Fblog\u002Fsitefinity-54-this-is-the-release-youve-been-waiting-for","Sitefinity 5.4 - The release you've been waiting for","2013-02-14T13:22:14.8100000Z",[122,19],{"path":517,"title":518,"publishedAt":519,"tags":520},"\u002Fblog\u002Fadd-custom-taxonomies-to-a-designer","Add Custom Taxonomies to a Designer","2013-01-02T14:58:44.9800000Z",[17,19],{"path":522,"title":523,"publishedAt":524,"tags":525},"\u002Fblog\u002Fpost-53-looking-to-54","Sitefinity 5.4 and beyond, more work to do","2012-12-18T17:51:07.9670000Z",[19,122,27],{"path":527,"title":528,"publishedAt":529,"tags":530},"\u002Fblog\u002Fsitefinity-context-management-explained-from-the-experts","Sitefinity ORM Context Management explained","2012-12-17T17:43:31.8230000Z",[17,19],{"path":532,"title":533,"publishedAt":534,"tags":535},"\u002Fblog\u002Fdisable-embedded-jquery-on-radcontrols","Disable RadControls embedded jQuery in Sitefinity","2012-12-10T17:48:44.9430000Z",[17,19],{"path":537,"title":538,"publishedAt":539,"tags":540},"\u002Fblog\u002Fmore-efficent-sitefinity-breadcrumb","More Efficent Sitefinity Breadcrumb","2012-11-26T04:57:00.5930000Z",[17,19],{"path":542,"title":543,"publishedAt":544,"tags":545},"\u002Fblog\u002Fsitefinity-dropbox-doesnt-work-the-way-you-think-it-does","Sitefinity Dropbox doesn't work the way you think it does","2012-11-20T16:12:23.7470000Z",[122,19],{"path":547,"title":548,"publishedAt":549,"tags":550},"\u002Fblog\u002Fsmall-thing-to-boost-performance","Loading Sitefinity faster on your dev box","2012-11-20T13:52:36.8000000Z",[17,19],{"path":552,"title":553,"publishedAt":554,"tags":555},"\u002Fblog\u002Fcustom-attributes-for-sitefinity-taxa","Custom attributes for Sitefinity Taxa","2012-11-01T16:19:24.1470000Z",[17,19],{"path":557,"title":558,"publishedAt":559,"tags":560},"\u002Fblog\u002Fwhats-new-in-sitefinity-52-webinar-qa-log","What's new in Sitefinity 5.2 Webinar QA Log","2012-10-25T16:00:16.5570000Z",[260,19],{"path":562,"title":563,"publishedAt":564,"tags":565},"\u002Fblog\u002Fsitefinity-53-planning-roadmap","Planning Roadmap for Sitefinity 5.3","2012-10-22T02:33:08.9000000Z",[260,19],{"path":567,"title":568,"publishedAt":569,"tags":570},"\u002Fblog\u002Fbetter-sitefinity-taxonomy-widget-you-should-use-this","Simplified no bloat html Sitefinity taxonomy widget","2012-09-15T21:02:57.9200000Z",[18,19,17],{"path":572,"title":573,"publishedAt":574,"tags":575},"\u002Fblog\u002Fwhats-new-in-sitefinity-51-webinar-qa-log","What's new in Sitefinity 5.1 Webinar QA Log","2012-07-19T16:24:33.7830000Z",[260],{"path":577,"title":578,"publishedAt":579,"tags":580},"\u002Fblog\u002Fintroducing-sitefinity-primer-nuget-101","Introducing Sitefinity Primer NuGet 1.0.1","2012-06-17T19:27:38.7000000Z",[260,19],{"path":582,"title":583,"publishedAt":584,"tags":585},"\u002Fblog\u002Ftime-to-disqus","Adding Disqus to your Sitefinity 4 site","2012-06-11T12:28:58.6930000Z",[260,19],{"path":587,"title":588,"publishedAt":589,"tags":590},"\u002Fblog\u002Fcould-not-load-file-or-assembly-system-data-sqlite","Could not load file or assembly System.Data.SQLite","2012-06-06T16:05:26.1230000Z",[18,19],{"path":592,"title":593,"publishedAt":594,"tags":595},"\u002Fblog\u002Fdecorate-your-sitefinity-forms-with-kendoui","Decorate your Sitefinity Forms with KendoUI","2012-05-30T01:55:21.5400000Z",[17,19,133],{"path":597,"title":598,"publishedAt":599,"tags":600},"\u002Fblog\u002Fjavascript-date-formatting","Javascript Date Formatting","2012-05-25T19:51:16.5500000Z",[17,133],{"path":602,"title":603,"publishedAt":604,"tags":605},"\u002Fblog\u002Fdebugging-a-kendo-template-loop","Debugging a Kendo Template Loop","2012-05-03T02:33:14.5230000Z",[17,133],{"path":607,"title":608,"publishedAt":609,"tags":610},"\u002Fblog\u002Favoid-version-errors-with-assembly-binding","Avoid Version errors with Assembly Binding","2012-03-25T15:09:00.0000000Z",[17,19,18],{"path":612,"title":613,"publishedAt":614,"tags":615},"\u002Fblog\u002Fsitefinity-how-to-list","How To List","2012-03-24T17:49:00.0000000Z",[17,19],{"path":617,"title":618,"publishedAt":619,"tags":620},"\u002Fblog\u002Fclientside-debugging-the-telerik-radcontrols","Clientside Debugging the Telerik RadControls","2012-03-23T17:28:00.0000000Z",[17],{"path":622,"title":623,"publishedAt":624,"tags":625},"\u002Fblog\u002Fsitefinity-validation-of-viewstate-mac-failed","Validation of viewstate MAC failed","2012-03-16T02:54:21.6930000Z",[17,19],{"path":627,"title":628,"publishedAt":629,"tags":630},"\u002Fblog\u002Fcontinuing-the-sitefinity-kendoui-posts","Continuing the Sitefinity KendoUI posts","2012-03-16T02:53:15.2370000Z",[17,133],{"path":632,"title":633,"publishedAt":634,"tags":635},"\u002Fblog\u002Fsimple-wcf-by-sitefinity","Simple WCF in Sitefinity","2012-03-16T02:52:46.9870000Z",[17,19],{"path":637,"title":638,"publishedAt":639,"tags":640},"\u002Fblog\u002Fjustcode-template-list","JustCode Template List","2012-03-16T02:51:10.3930000Z",[260,19],{"path":642,"title":643,"publishedAt":644,"tags":645},"\u002Fblog\u002Fcustomize-the-page-editing-experience-for-your-users","Customizing the Sitefinity Page Editor","2012-03-16T02:50:36.0070000Z",[17,19],{"path":647,"title":648,"publishedAt":649,"tags":650},"\u002Fblog\u002Fsitefinity-43-44-webinar-notes","Sitefinity 4.3-4.4 Webinar notes","2012-03-16T02:49:50.3930000Z",[260,19],{"path":652,"title":653,"publishedAt":654,"tags":655},"\u002Fblog\u002Frow-not-found-genericoid-error","Row not found: GenericOID Error","2012-03-16T02:47:56.4170000Z",[17],{"path":657,"title":658,"publishedAt":659,"tags":660},"\u002Fblog\u002Fsitefinity-embedding-a-google-wave-instance","Sitefinity: Embedding a Google Wave Instance","2012-03-16T02:45:05.6070000Z",[260,19],{"path":662,"title":663,"publishedAt":664,"tags":665},"\u002Fblog\u002Fusing-cufon-with-asp-net-and-telerik","Using Cufon with ASP.NET and Telerik","2012-03-16T02:43:59.4000000Z",[17],{"path":667,"title":668,"publishedAt":669,"tags":670},"\u002Fblog\u002Fopenaccess-nested-repeater-to-generic-list-property","OpenAccess Nested Repeater to Generic List Property","2012-03-16T02:40:36.0800000Z",[17],{"path":672,"title":673,"publishedAt":674,"tags":675},"\u002Fblog\u002Ftelerik-reporting-needsdatasource","Telerik Reporting: NeedsDataSource","2012-03-16T02:39:59.7370000Z",[17],{"path":677,"title":678,"publishedAt":679,"tags":680},"\u002Fblog\u002Finstalling-elmah-with-sitefinity","Installing ELMAH with Sitefinity","2012-03-16T02:38:52.7370000Z",[17,19],{"path":682,"title":683,"publishedAt":684,"tags":685},"\u002Fblog\u002Fbetter-sitefinity-file-page","Better Sitefinity File Page in Sitefinity 3.x","2012-03-16T02:37:36.6870000Z",[17,19,18],{"path":687,"title":688,"publishedAt":689,"tags":690},"\u002Fblog\u002Fmore-editing-options-for-your-generic-content","More tools for Generic Content in Sitefinity 3.x","2012-03-16T02:36:03.1070000Z",[17,19],{"path":692,"title":693,"publishedAt":694,"tags":695},"\u002Fblog\u002Fscreenshot-of-sitefinity-4-analytics","Screenshot of Sitefinity 4 Analytics","2012-03-16T02:35:05.9000000Z",[696,19],"Previews",{"path":698,"title":699,"publishedAt":700,"tags":701},"\u002Fblog\u002Fusing-button-selectors","Using Button Selectors with Sitefinity 3.x","2012-03-16T02:33:32.3270000Z",[17,19],{"path":703,"title":704,"publishedAt":705,"tags":706},"\u002Fblog\u002Fhyperlinks-in-external-templates","Hyperlinks in External Templates","2012-03-16T02:29:46.4530000Z",[17,19],{"path":708,"title":709,"publishedAt":710,"tags":711},"\u002Fblog\u002Fstored-procedure-for-obtaining-wf4-bookmarks","Stored Procedure for obtaining WF4 bookmarks","2012-03-16T02:28:54.9770000Z",[17],{"path":713,"title":714,"publishedAt":715,"tags":716},"\u002Fblog\u002Fpeople-make-your-radeditor-voices-heard","Voice your RadEditor frustrations","2012-03-16T02:27:16.6030000Z",[260],{"path":718,"title":719,"publishedAt":720,"tags":721},"\u002Fblog\u002Fnew-old-controls-jul-2010","New Old Controls Jul, 2010","2012-03-16T02:23:38.4600000Z",[260,19],{"path":723,"title":724,"publishedAt":725,"tags":726},"\u002Fblog\u002Fsitefinity-4","Sitefinity 4.0","2012-03-16T02:22:51.3000000Z",[260,19,122],{"path":728,"title":729,"publishedAt":730,"tags":731},"\u002Fblog\u002Fusing-webservices-with-telerik-openaccess","Using Webservices with Telerik OpenAccess","2012-03-16T02:17:37.4530000Z",[17],{"path":733,"title":734,"publishedAt":735,"tags":736},"\u002Fblog\u002Fsitefinity-radwindow-popup-styles","Sitefinity RadWindow popup styles","2012-03-16T02:15:35.4400000Z",[17,19],{"path":738,"title":739,"publishedAt":740,"tags":741},"\u002Fblog\u002Fchanging-the-look-of-controls-dropped-onto-your-page","Changing the look of controls dropped onto your page","2012-03-16T02:13:11.3030000Z",[17],{"path":743,"title":744,"publishedAt":745,"tags":746},"\u002Fblog\u002Fnew-control-background-image-content","Background Image Content Widget for Sitefinity 3","2012-03-16T02:10:52.1570000Z",[260,19],{"path":748,"title":749,"publishedAt":750,"tags":751},"\u002Fblog\u002Fquerying-telerik-openaccess-with-linqpad","Querying Telerik OpenAccess with LinqPad","2012-03-16T02:02:11.3400000Z",[17],{"path":753,"title":754,"publishedAt":755,"tags":756},"\u002Fblog\u002Ffix-sitefinity-edit-mode-style","Fix Sitefinity 3.x Edit Mode Style","2012-03-16T01:58:29.3300000Z",[17,19],{"path":758,"title":759,"publishedAt":760,"tags":761},"\u002Fblog\u002Ftelerik-reporting-export-on-button-click","Telerik Reporting: Export On Button Click","2012-03-16T01:57:18.1630000Z",[17],{"path":763,"title":764,"publishedAt":765,"tags":766},"\u002Fblog\u002Ftelerik-please-fix-charting","Telerik, Please fix charting!","2012-03-16T01:55:30.9600000Z",[27],{"path":768,"title":769,"publishedAt":770,"tags":771},"\u002Fblog\u002Fcompiling-controls-against-multiple-sitefinity-versions","Compiling Projects against multiple versions","2012-03-16T01:53:19.1770000Z",[17,19],{"path":773,"title":774,"publishedAt":775,"tags":776},"\u002Fblog\u002Frandom-site-controls-updates","Sitefinity v3 RandomSiteControls Release Notes","2012-03-16T01:52:09.7700000Z",[260],{"path":778,"title":779,"publishedAt":780,"tags":781},"\u002Fblog\u002Fmoving-the-sitefinity-logo","Moving the sitefinity logo","2012-03-16T01:49:13.2570000Z",[17,19],{"path":783,"title":784,"publishedAt":785,"tags":786},"\u002Fblog\u002Fleverage-radeditor-to-strip-html","Stripping HTML using the RadEditor","2012-03-16T01:48:27.0170000Z",[17,19],{"path":788,"title":789,"publishedAt":790,"tags":791},"\u002Fblog\u002Fdebugging-a-bad-webresource-axd-request","Debugging a bad WebResource.axd request","2012-03-16T01:45:40.6070000Z",[17,18],{"path":793,"title":794,"publishedAt":795,"tags":796},"\u002Fblog\u002Fcreating-extension-methods-with-openaccess","Extension Methods with OpenAccess","2012-03-16T01:44:26.8970000Z",[17,19],{"path":798,"title":799,"publishedAt":800,"tags":801},"\u002Fblog\u002Fwhy-pits-is-the-pits","Why PITS is the PITS","2012-03-16T01:42:38.1430000Z",[27,19],{"path":803,"title":804,"publishedAt":805,"tags":806},"\u002Fblog\u002Fdb-driven-scripting-and-styling-with-sf4","DB Driven Scripting and Styling with SF4","2012-03-16T01:42:03.1700000Z",[17,19],{"path":808,"title":809,"publishedAt":810,"tags":811},"\u002Fblog\u002Fmissing-from-sitefinity-4-release","What's Missing from Sitefinity 4 Release","2012-03-16T01:41:29.6100000Z",[122,19],{"path":813,"title":814,"publishedAt":815,"tags":816},"\u002Fblog\u002Fsitefinity-ecommerce-module-coming-soon","Sitefinity eCommerce module coming","2012-03-16T01:40:38.8470000Z",[260,19],{"path":818,"title":819,"publishedAt":820,"tags":821},"\u002Fblog\u002Fpreventing-content-popping-with-kendoui-splitter","Preventing Content Popping with KendoUI","2012-03-16T01:39:31.3930000Z",[17,133],{"path":823,"title":824,"publishedAt":825,"tags":826},"\u002Fblog\u002Fsitefinity-43-44-roadmap-review","Sitefinity 4.3-4.4 Roadmap Review","2012-03-16T01:34:23.2630000Z",[122,19],{"path":828,"title":829,"publishedAt":830,"tags":831},"\u002Fblog\u002Fadvanced-radxmlhttppanel","Advanced RadXmlHttpPanel","2012-03-16T01:30:57.2470000Z",[17,133],{"path":833,"title":834,"publishedAt":835,"tags":836},"\u002Fblog\u002Fcross-browser-css-gradients","Cross-Browser CSS Gradients","2012-03-16T01:27:43.2130000Z",[17,111],{"path":838,"title":839,"publishedAt":840,"tags":841},"\u002Fblog\u002Fpositioning-in-sitefinity-4","Positioning in Sitefinity 4","2012-03-16T01:26:31.2870000Z",[17],{"path":843,"title":844,"publishedAt":845,"tags":846},"\u002Fblog\u002Fspeed-up-your-site-on-the-cheap","Improve performance with Rackspace Cdn","2012-03-16T01:23:51.3100000Z",[122],{"path":848,"title":849,"publishedAt":850,"tags":851},"\u002Fblog\u002F4-1-update-issues","Update Issues for Sitefinity 4.1","2012-03-16T01:15:53.1970000Z",[122,19,18],{"path":853,"title":854,"publishedAt":855,"tags":856},"\u002Fblog\u002Fradnotification-peering-into-the-future","RadNotification...peering into the future?","2012-03-16T01:13:56.5370000Z",[122],{"path":858,"title":859,"publishedAt":860,"tags":861},"\u002Fblog\u002Fthe-best-stored-procedure-youll-ever-use-for-sitefinity","Search All Tables SQL Stored Procedure","2012-03-16T01:11:10.7070000Z",[17,19],{"path":863,"title":864,"publishedAt":865,"tags":866},"\u002Fblog\u002Fblog-post-title-images","Blog Post Title Images","2012-03-15T23:44:47.0830000Z",[17],{"path":868,"title":869,"publishedAt":870,"tags":871},"\u002Fblog\u002Fhidden-but-powerful-q3-2010-styling-features","Hidden but powerful Q3 2010 styling features","2012-03-15T23:27:27.5730000Z",[696,17],{"path":873,"title":874,"publishedAt":875,"tags":876},"\u002Fblog\u002F43-roadmap-wishlist","Sitefinity 4.3 Roadmap wishlist","2012-03-15T23:23:18.9230000Z",[696,19,27],1786049908282]