Hi. I have been recently been told that I should not be using StringBuilders in razor because they can't be cached and adversely affect server performance. Is this true? I understand that a 'purist' probably wouldn't put any c# code in razor but that seems to slightly negate the whole point of having razor. Can anyone offer advice please? Thanks
I'm pretty sure that is rubbish. Razor views get compiled to C# classes at run-time and are for all intents and purposes treated just like any other class or code. You can find the compiled classes in your Temporary ASP.NET Files folder. Here's an extract from a compiled master view:
#pragma checksum "D:\Websites\Umbraco\V7 Test\UmbracoCms.7.3.7\Views\Master.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "0C006E4C5DF307A523F60E07B8055DEB6E07B654"
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ASP {
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Helpers;
using System.Web.Security;
using System.Web.UI;
using System.Web.WebPages;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using System.Web.Mvc.Html;
using System.Web.Routing;
using Umbraco.Web;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Web.Mvc;
using umbraco;
using Examine;
using WebMatrix.Data;
using WebMatrix.WebData;
using Microsoft.Web.Helpers;
public class _Page_Views_Master_cshtml : Umbraco.Web.Mvc.UmbracoTemplatePage {
#line hidden
public _Page_Views_Master_cshtml() {
}
protected ASP.global_asax ApplicationInstance {
get {
return ((ASP.global_asax)(Context.ApplicationInstance));
}
}
public override void Execute() {
#line 2 "D:\Websites\Umbraco\V7 Test\UmbracoCms.7.3.7\Views\Master.cshtml"
Layout = null;
var home = @CurrentPage.Site();
#line default
#line hidden
WriteLiteral("\n\n<!DOCTYPE html>\n<html");
WriteLiteral(" lang=\"en\"");
WriteLiteral(">\n <head>\n\n <!-- Meta tags -->\n <meta");
WriteLiteral(" charset=\"utf-8\"");
WriteLiteral(">\n <meta");
WriteLiteral(" http-equiv=\"X-UA-Compatible\"");
WriteLiteral(" content=\"IE=edge\"");
WriteLiteral(">\n <meta");
WriteLiteral(" name=\"viewport\"");
WriteLiteral(" content=\"width=device-width, initial-scale=1\"");
WriteLiteral(">\n <meta");
WriteLiteral(" name=\"description\"");
WriteAttribute("content", Tuple.Create(" content=\"", 356), Tuple.Create("\"", 394)
#line 15 "D:\Websites\Umbraco\V7 Test\UmbracoCms.7.3.7\Views\Master.cshtml"
, Tuple.Create(Tuple.Create("", 366), Tuple.Create<System.Object, System.Int32>(CurrentPage.siteDescription
#line default
#line hidden
, 366), false)
);
WriteLiteral(">\n\n <title>");
#line 17 "D:\Websites\Umbraco\V7 Test\UmbracoCms.7.3.7\Views\Master.cshtml"
Write(CurrentPage.Name);
Thanks for the reply. It's an interesting one. So is it okay for me to use a string builder in razor to create, say, my navigation structure on each page? In theory each page would be slightly different, having a different 'on' page, so caching seems largely irrelevant for this anyway. Thanks!
The only downside of doing this is that if other people go through your code they might not expect to find string builders in a view. I always keep as much logic as I can in the controllers as I work as part of a team and it's good practice to keep clean and easy to read code!
Stringbuilders and razor
Hi. I have been recently been told that I should not be using StringBuilders in razor because they can't be cached and adversely affect server performance. Is this true? I understand that a 'purist' probably wouldn't put any c# code in razor but that seems to slightly negate the whole point of having razor. Can anyone offer advice please? Thanks
I'm pretty sure that is rubbish. Razor views get compiled to C# classes at run-time and are for all intents and purposes treated just like any other class or code. You can find the compiled classes in your Temporary ASP.NET Files folder. Here's an extract from a compiled master view:
Thanks for the reply. It's an interesting one. So is it okay for me to use a string builder in razor to create, say, my navigation structure on each page? In theory each page would be slightly different, having a different 'on' page, so caching seems largely irrelevant for this anyway. Thanks!
Hi Mike
The only downside of doing this is that if other people go through your code they might not expect to find string builders in a view. I always keep as much logic as I can in the controllers as I work as part of a team and it's good practice to keep clean and easy to read code!
is working on a reply...