Surendra Sharma

Surendra Sharma

Search This Blog

Monday, April 13, 2015

How to do versioning of JS and CSS files in ASP.NET

Whenever user access any website - images, JS and CSS are cached by browser. But if JS and CSS are updated on server still client browser refer the old JS and CSS. That’s very bad. It’s always good practice to provide the latest copy of CSS and JS to client browser.

But how to do it in ASP.NET to make sure browser is getting the updated files.

To solve this, we can use query string with JS and CSS.

For CSS, take one literal in <Head> section of aspx page as below

<head runat="server">
<asp:Literal ID="ltStyleCss" runat="server" Text="" ></asp:Literal>
</head>

Write below code

public string CurrentVersion = "";

protected void Page_Load(object sender, EventArgs e)
{
CurrentVersion = DateTime.Today.ToString("MMddyyyy") + "_" + DateTime.Now.Hour.ToString();

ltStyleCss.Text = string.Format("<link href=\"/ css/style.css?ver={0}\" rel=\"stylesheet\" />", CurrentVersion) + System.Environment.NewLine;


Here we are declaring version for each hour of the day.

You can do it for each request by specifyin current datetime, but problem with that approach is that it affects network bandwidth. So per hour solution is better.

It’s very easy to specify it for JS by directly passing the version variable as query string  

<script src="/Presentation/scripts/jquery.js?ver=<%=CurrentVersion%>"></script>

Pretty simple for JS but you can’t achieve the same way for CSS. Let me know if you can do it for CSS as well.


Please leave your comments or share this tip if it’s useful for you.

Sunday, April 12, 2015

How to implement Facebook Tag API script or Facebook Analytic tracking script

Facebook analytic is great way to track your website access by analyzing custom audience source. Facebook called it as Facebook Tag API.

To work with this you need Facebook tracking ID. I represented it as “NNNNN”. In project store it either in web.config or database. Below is script that you need to place it before the end of </body> section of webpage.

    <script>(function () {
    var _fbq = window._fbq || (window._fbq = []);
    if (!_fbq.loaded) {
        var fbds = document.createElement('script');
        fbds.async = true;
        fbds.src = '//connect.facebook.net/en_US/fbds.js';
        var s = document.getElementsByTagName('script')[0];
        s.parentNode.insertBefore(fbds, s);
        _fbq.loaded = true;
    }
    _fbq.push(['addPixelId', 'NNNNN']);
})();
window._fbq = window._fbq || [];
window._fbq.push(['track', 'PixelInitialized', {}]);
    </script>
    <noscript><img height="1" width="1" alt="" style="display:none" src="https://www.facebook.com/tr?id=NNNNN&amp;ev=PixelInitialized" /></noscript>

This much of information is enough to implement it in any web application like ASP.NET etc. Though programmer don’t like much theoretical reading however you can read more from https://developers.facebook.com/docs/ads-for-websites/tag-api

Please leave your comments or share this script if it’s useful for you.

Friday, April 10, 2015

How to break or put Sitecore config file data into other config files

I am damn sure that you must sometimes face this problem during reading, finding or modifying any entry in Sitecore web.config file.

The config file that I have contains 3950 lines. WTF how to work with such a large file. Is there any way to break it?

Fortunetly YES. Here is the trick.

·         Cut all data lines after </appSettings> and before <log4net> from web.config i.e. cut "<sitecore " section only

</appSettings>
  <sitecore database="SqlServer">
  </sitecore>
<log4net>             

·         Create "sitecore.config" in "App_Config" folder and put all the data into it as
<?xml version="1.0" encoding="utf-8" ?>
 <sitecore database="SqlServer">

          -----
</sitecore>

 At runtime Sitecore merge all these config files and treat them as a single file and work smartly.

Please leave your comments or share this trick if it’s useful for you.

Sunday, March 29, 2015

How to specify location of images in aspx page for Sitecore

I was clueless while displaying search image in all the aspx pages and ascx web control of Sitecore. As on some pages I was getting my image but while on some pages I was not missing the image.

I tried different path as below but all was wrong

<img src="../images/search.png" alt="search image" />
<img src="~/images/search.png" alt="search image" />
<img src="images/search.png" alt="search image" />

Correct one is to use path that starts with “/” as it automatically resolve its path as below

<img src="/images/search.png" alt="search image" />

Final note is - Never specify "../" for any image as for any web request IIS resolve it accordingly. So always write root path as "/" + physical image path.

Hope it helps someone in anyway.


Please leave your comments or share this tip if it’s useful for you.

Saturday, March 28, 2015

How to repeat particular string or char into certain number of times

I was writing a program for showing a tree structure in textbox. I was trying to concatenate tabs and spaces in string. Soon I realize that it’s a very tedious way to achieve the result. I thought that .NET is the Ocean and there must be some way to repeat the particular string or character certain number of times. For example if I have character ‘0’ and I want to display it 5 times on screen. 

How to do it?

FOR and FOR EACH Loops are common, but I need some more smart way do it.
Here are some ways that I found

int count = 5;
string str = "PEACE ";
char c = '0';

Console.WriteLine(String.Empty.PadLeft(count, c));     //Output- 00000

string result = new String(c, count);
Console.WriteLine(result); //Output- 00000

Console.WriteLine(new StringBuilder().Insert(0, str, count).ToString());   //Output- PEACE PEACE PEACE PEACE PEACE

First two only repeat characters while last way is to repeat string. Hope this help someone.

Please leave your comments or share this code if it’s useful for you.

Friday, March 27, 2015

How to include or put or embed curly braces in string.Format in C#

I was writing a HTML style within my repeater from code behind page as below

string s = string.Format("<style>.splashImg{0} { background-image:url({1}  );}</style>", 3, " myimage.jpg");

So that my final output should be like

<style>.splashImg3{ background-image:url(myimage.jpg);} </style>

And OMG I received error “Unrecognized escape sequence”. My first reaction was WTF what’s wrong with this code line. After careful look I come to know that it’s a problem of curly braces “{ }“.

As we are specifying curly braces for placeholder like {0} {1}, compiler is confused with other braces like “splashImg3{“.

So simplest solution is just write double braces for non-placeholder braces like “{{“ as shown in yellow color. So final code looks like

string s = string.Format("<style>.splashImg{0} {{ background-image:url( {1}  );}}</style>", 2, "myimage.jpg");


Please leave your comments or share this code if it’s useful for you.

Thursday, March 19, 2015

How to apply workflow to all the items of content tree in Sitecore

Its common scenario that, if you created items first and later on creating workflow then you have to manually apply those workflow on template’s standard values and content items.

If there are few items then it fine to do it  manually. But what if there are hundreds, thousands content item.

Best way is to apply them programmatically.

Here is a code to do it. Just put Home item ID or start item

var FirstItem = Sitecore.Context.Database.GetItem(new ID("{A00A11B6-E6DB-45AB-8B54-636FEC3B5523}")) ;
PrintName(FirstItem , 1);

Rest of the item should be iterate by following recursive function and apply workflow on all the items except folder item.

private Item PrintName(Item mainItem, int icounter)
{
    string f = new string('-', icounter);
    TextBox1.Text += f + mainItem.DisplayName + System.Environment.NewLine;

    try
    {
        if (!mainItem.DisplayName.Equals("Homepage"))
        {
            //Put Workflow ID here
            var workflow = Factory.GetDatabase("master").WorkflowProvider.GetWorkflow("{7E9BC450-18EE-401E-892A-1CEF27BF8D9B}");
            workflow.Start(mainItem);
        }
    }
    catch (Exception)
    {
        TextBox1.Text += "Error " + mainItem.DisplayName + System.Environment.NewLine;
    }

    if (mainItem.HasChildren)
    {
        icounter++;
        foreach (var myInnerItem in mainItem.Children.ToList())
        {
            PrintName(myInnerItem, icounter);
        }
    }

    icounter--;
    return null;
}

Please leave your comments or share this code if it’s useful for you.