QR Code generation in ASP.NET MVC
One option is to use the Google Chart Server API to do it.
For instance, here's the QR code for this very page...
No code required :)
There are more details in the linked documentation, but you start with a URL of https://chart.googleapis.com/chart?, then add query parameters of:
cht=qr
: Specify that you want a QR codechs=
size: Specify the size, e.g.200x200
chl=
data: Specify the data, e.g. a URL
There are other query parameters for output encoding and error correction.
I wrote a basic HTML helper method to emit the correct <img>
tag to take advantage of Google's API. So, on your page (assuming ASPX view engine) use something like this:
<%: Html.QRCodeImage(Request.Url.AbsolutePath) %>
<%: Html.QRCodeImage("Meagre human needs a phone to read QR codes. Ha ha ha.") %>
Or if you want to specify the size in pixels (the image is always square):
<%: Html.QRCodeImage(Request.Url.AbsolutePath, size: 92) %>
Here is the code:
public static class QRCodeHtmlHelper
{
/// <summary>
/// Produces the markup for an image element that displays a QR Code image, as provided by Google's chart API.
/// </summary>
/// <param name="htmlHelper"></param>
/// <param name="data">The data to be encoded, as a string.</param>
/// <param name="size">The square length of the resulting image, in pixels.</param>
/// <param name="margin">The width of the border that surrounds the image, measured in rows (not pixels).</param>
/// <param name="errorCorrectionLevel">The amount of error correction to build into the image. Higher error correction comes at the expense of reduced space for data.</param>
/// <param name="htmlAttributes">Optional HTML attributes to include on the image element.</param>
/// <returns></returns>
public static MvcHtmlString QRCode(this HtmlHelper htmlHelper, string data, int size = 80, int margin = 4, QRCodeErrorCorrectionLevel errorCorrectionLevel = QRCodeErrorCorrectionLevel.Low, object htmlAttributes = null)
{
if (data == null)
throw new ArgumentNullException("data");
if (size < 1)
throw new ArgumentOutOfRangeException("size", size, "Must be greater than zero.");
if (margin < 0)
throw new ArgumentOutOfRangeException("margin", margin, "Must be greater than or equal to zero.");
if (!Enum.IsDefined(typeof(QRCodeErrorCorrectionLevel), errorCorrectionLevel))
throw new InvalidEnumArgumentException("errorCorrectionLevel", (int)errorCorrectionLevel, typeof (QRCodeErrorCorrectionLevel));
var url = string.Format("http://chart.apis.google.com/chart?cht=qr&chld={2}|{3}&chs={0}x{0}&chl={1}", size, HttpUtility.UrlEncode(data), errorCorrectionLevel.ToString()[0], margin);
var tag = new TagBuilder("img");
if (htmlAttributes != null)
tag.MergeAttributes(new RouteValueDictionary(htmlAttributes));
tag.Attributes.Add("src", url);
tag.Attributes.Add("width", size.ToString());
tag.Attributes.Add("height", size.ToString());
return new MvcHtmlString(tag.ToString(TagRenderMode.SelfClosing));
}
}
public enum QRCodeErrorCorrectionLevel
{
/// <summary>Recovers from up to 7% erroneous data.</summary>
Low,
/// <summary>Recovers from up to 15% erroneous data.</summary>
Medium,
/// <summary>Recovers from up to 25% erroneous data.</summary>
QuiteGood,
/// <summary>Recovers from up to 30% erroneous data.</summary>
High
}