Learning SharePoint – Part III
Except for a project I did last year, I haven’t done much ASP.NET development. I have always been a back-end developer. Writing Windows services, utilities, ETL, security systems, others… So, while I am learning about SharePoint development, I am also learning a great deal about ASP.NET development in general. This is very exciting for me because while I love back end development, all my friends have done cool web applications so I wanna play too!
I just ordered Inside Microsoft Windows SharePoint Services, by Ted Pattison and Daniel Larson. Two chapters are available online, which I came across while trying to understand how SharePoint uses master pages. The book recommends opening C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\GLOBAL\default.master and learning about now it works. In fact, this is the quote from the book “It's definitely worth your time to open up a copy of the default.master file within Microsoft Visual Studio and try to absorb all that's there.”
Okay, well, I am down for that.
@Register
The first few lines of the master page look like this:
1: <%@ Master Language="C#" %>
2:
3: <%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
4: <%@ Register TagPrefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
5: <%@ Import Namespace="Microsoft.SharePoint" %>
6: <%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %>
The first line’s purpose is apparent, but what does <% @Register…%> mean? Here is where my ignorance comes into play. I did a ton of web development back in the Classic ASP days so the old <% %> tags look agonizingly familiar. Surely not the same thing, right?
No, but the family tree is apparent. Oh, by the way, as I read about ASP.NET Page Syntax, I branched off to learn something about DOCTYPES (great article). It is interesting to note the effect DOCTYPE has on how a browser renders a page and how validation is also effected. In particular, the DOCTYPE commonly cut and pasted from w3c’s web site:
1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2: "DTD/xhtml1-strict.dtd">
Is actually totally useless because the .dtd it references is a on path relative to w3c’s website! Use this instead:
1: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2: "https://www.w3.org/TR/html4/strict.dtd">
So, back to <% @Register…%>. The <% %> signals to ASP.NET that it should pay attention to the enclosed text. That’s about as simple as I can describe it.
When you use a control, such as a panel control, you use the syntax <asp:panel> </asp:panel>.
<% @Register…%> allows the developer to associate an alias with namespaces and classes so that you can essentially replicate the <asp:?> </asp:?> declaration but with custom user controls. So, if I have a control called OrderWidget, which collects order information on a page, I can use <% @Register…%> to create an alias to the OrderWidget control and declaratively include the control in my page:
1: <@ Register tagprefix=”Mcs”, tagName=”OrderWidget”, src=”~/OrderWidgetControl.ascx” %>
1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2: "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3:
4: <html>
5: <head runat="server">
6: <title>Order Page</title>
7: </head>
8: <body>
9: <form id="form1" runat="server">
10: <Mcs:OrderWidget runat="server" />
11: </form>
12: </body>
13: </html>
In SharePoint's default.master, this is used extensively. Here is an example:
1: <%@ Register TagPrefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
And further down:
1: <WebPartPages:SPWebPartManager ID="m" runat="Server" />
A key difference from my simple example is the use of an AssemblyName, which relates the prefix to an assembly versus as .ascx file.
<html dir=…>
Default.master’s opening html tag looks like this:
1: <html dir="<%$Resources:wss,multipages_direction_dir_value%>" runat="server" xmlns:o="urn:schemas-microsoft-com:office:office">
The “dir” attribute indicates to the browser which direction text should run, which is important because many languages run right to left, versus English’s left to right.
Note the <%Resources:wss, multipages …%>. The <%$Resources…%> declaration is interesting. ASP.NET expressions (prefixed by the $ sign) is a powerful technology which enables the declarative setting of properties based on information evaluated at run time. In this case, the $Resources expression allows the loading of string resource information from a .resx file. In the example above, a wss.resx exists (which can be found in the 12 hive at C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\CONFIG\Resources), which has a resource “multipages_direction_dir_value” defined:
1: <data name="multipages_direction_dir_value">
2: <value>ltr</value>
3: </data>
Pretty nifty! More later…