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 )

Google+ photo

You are commenting using your Google+ 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 )

Connecting to %s

Вула Чăвашла

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

Discovering SharePoint

And going crazy doing it

Bram de Jager - Coder, Speaker, Author

Office 365, SharePoint and Azure

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

Aryan Nava

| Blockchain | Serverless Architecture | Microservices Architecture | DevOps | AWS Lambda | Teraform |

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

Treacle tarts for great justice

... And All That JS

JavaScript, Web Apps and SharePoint

blksthl

Mostly what I know about SharePoint - CommunicoCuspis

%d bloggers like this: