CHUVASH.eu

CHunky Universe of Vigourous Astonishing SHarepoint :)

Custom HttpHandler in SharePoint for getting dynamic javascript code

Sometimes I want to add some dynamic javascript code. E.g. I had an idea to get javascript code for localization dynamically. Kirk Evan provides a very clean approach to add ASP.NET HttpHandler to SharePoint. This is just a little lab:

Create a SharePoint empty project. I call it Jerkelle.
Create a class called Resx2JsHandler and implement the IHttpHandler interface
Add the mapped folder Layouts and create Jerkelle.ashx file

Here is the project. I probably will publish it on my github account:

The Jerkelle.ashx file is very simple, it references to the code file (Resx2JsHandler.cs):

<%@ Assembly Name="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Assembly Name="Jerkelle, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1140e8620a44557a" %>
<%@ WebHandler Language="C#" Class="Jerkelle.Resx2JsHandler" %>

The code file is nothing advanced neither, for this little lab:

using System.Web;

namespace Jerkelle
{
    public class Resx2JsHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Response.Write("Hello HttpHandler from the site ");
        }

        public bool IsReusable
        {
            get { return false; }
        }
    }
}

So now it is time to deploy! Then when we hit the ashx in the address bar we’ll get the nice message: “Hello HttpHandler from the site”. Isn’t it beautiful?

Allright, so far so good. But the intention of this lab is to create a dynamic javascript file. Well, it doesn’t need to be dynamic for now. Let’s convert it to a javascript source file. In order to quickly test, let’s write a simple alert:

using System.Web;

namespace Jerkelle
{
    public class Resx2JsHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "application/x-javascript";
            context.Response.Write("alert('Hello from ashx');");
        }

        public bool IsReusable
        {
            get { return false; }
        }
    }
}

Now we can run this by adding it to the page as a script. Or just let’s add it with a little script (like we did with jQuery):

var script = document.createElement("script");
script.setAttribute("type","text/javascript");
script.setAttribute("src","/_layouts/jerkelle.ashx");
document.body.appendChild(script);

And it works!

Alright, we go a step further, we create an httphandler which returns the localization strings as javascript:

public class Resx2JsHandler : IHttpHandler
{
    public bool IsReusable
    {
        get { return false; }
    }
    public void ProcessRequest(HttpContext context)
    {
        var res = context.Request.QueryString["res"];
        var js = GetJavascript(res);
        context.Response.ContentType = "application/x-javascript";
        context.Response.Write(js);
    }

    private static string GetJavascript(string res)
    {
        var result = string.Empty;
        if (res == null)
        {
            return result;
        }
        var ci = SPContext.Current != null
                        ? new CultureInfo((int) SPContext.Current.Web.Language)
                        : CultureInfo.CurrentCulture;
        var name = ci.Name;
        var fileName = string.Format("\\Resources\\{0}.{1}.resx", res, name);
        var path = SPUtility.GetGenericSetupPath(fileName);
        var text = GetContent(path);
        var json = ConvertToJson(text);
        result = string.Format("{0} = {1};\n", res, json);
        return result;
    }

    private static string ConvertToJson(string text)
    {
        var json = string.Empty;

        var doc = new XmlDocument();
        doc.LoadXml(text);
        var elements = doc.SelectNodes("/root/data");
        if (elements == null)
        {
            return json;
        }
        var pairs = new List();
        foreach(XmlNode e in elements)
        {
            var name = e.Attributes[0].Value;
            var value = e.FirstChild.InnerText.Trim().Replace("\"", "'");
            value = Regex.Replace(value, "\r?\n", "");
            var pair = string.Format("\t\"{0}\" : \"{1}\"", name, value);
            pairs.Add(pair);
        }
        var s = string.Join(",\n", pairs.ToArray());
        json = string.Format("{{\n{0}}}", s);
        return json;
    }

    private static string GetContent(string path)
    {
        var content = string.Empty;
        SPSecurity.RunWithElevatedPrivileges(() =>
        {
            content = System.IO.File.ReadAllText(path);
        });
        return content;
    }
}

User res query string to get a localization file:

ScriptResx.ashx

EDIT: Later I discovered ScriptResx.ashx: there is already such an httphandler, with its shortcomings but, it is already implemented.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Вула Чăвашла

VulaCV - Чăвашла вулаттаракан сайт

Discovering SharePoint

And going crazy doing it

Bram de Jager talking Office 365, SharePoint and Azure

My view and thoughts on Productivity and more.

My programming life

and everything in between

SharePoint Development Lab by @avishnyakov

It is a good place to share some SharePoint stories and development practices.

SharePoint Dragons

Nikander & Margriet on SharePoint

Paul J. Swider - RealActivity

RealActivity is a specialized healthcare services and solution advisory firm.

Mai Omar Desouki - Avid SharePointer

Egyptian & Vodafoner - Senior SharePoint Consultant

Cameron Dwyer | Office 365, SharePoint, Outlook, OnePlace Solutions

Office 365, SharePoint, OnePlace Solutions & Life's Other Little Wonders

paul.tavares

Me and My doings!

Share SharePoint Points!!

By Mohit Vashishtha

Jimmy Janlén "Den Scrummande Konsulten"

Erfarenheter, synpunkter och raljerande om Scrum från Jimmy Janlén

SPJoel

SharePoint for everyone

SharePointRyan

Ryan Dennis is a SharePoint Solution Architect with a passion for SharePoint and PowerShell

SharePoint 2020

The Vision for a Future of Clarity

Aharoni in Unicode, ya mama

Treacle tarts for great justice

... And All That JS

JavaScript, Web Apps and SharePoint

%d bloggers like this: