Since closing the html tag is optional, is it okay to include markup after a closing </html>
tag?
An example of this exists with Phil Haack's RouteDebugger library. Some sample output looks like this:
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
<link href="/Content/Site.css" rel="stylesheet" type="text/css" />
<script src="/Scripts/jquery-1.4.4.min.js" type="text/javascript"></script>
</head>
<body>
<h2>Index</h2>
</body>
</html>
<!-- Extra content after closing html tag! -->
<html>
<div id="haackroutedebugger" style="background-color: #fff;">
<style>
#haackroutedebugger, #haackroutedebugger td, #haackroutedebugger th {background-color: #fff; font-family: verdana, helvetica, san-serif; font-size: small;}
#haackroutedebugger tr.header td, #haackroutedebugger tr.header th {background-color: #ffc;}
</style>
<hr style="width: 100%; border: solid 1px #000; margin:0; padding:0;" />
<h1 style="margin: 0; padding: 4px; border-bottom: solid 1px #bbb; padding-left: 10px; font-size: 1.2em; background-color: #ffc;">Route Debugger</h1>
<div id="main" style="margin-top:0; padding-top:0">
<p style="font-size: .9em; padding-top:0">
Type in a url in the address bar to see which defined routes match it.
A {*catchall} route is added to the list of routes automatically in
case none of your routes match.
</p>
<p style="font-size: .9em;">
To generate URLs using routing, supply route values via the query string. example: <code>http://localhost:14230/?id=123</code>
</p>
<p><label style="font-weight: bold; font-size: 1.1em;">Matched Route</label>: {controller}/{action}/{id}</p>
<div style="float: left;">
<table border="1" cellpadding="3" cellspacing="0" width="300">
<caption style="font-weight: bold;">Route Data</caption>
<tr class="header"><th>Key</th><th>Value</th></tr>
<tr><td>controller</td><td>Home </td></tr> <tr><td>action</td><td>Index </td></tr>
</table>
</div>
<div style="float: left; margin-left: 10px;">
<table border="1" cellpadding="3" cellspacing="0" width="300">
<caption style="font-weight: bold;">Data Tokens</caption>
<tr class="header"><th>Key</th><th>Value</th></tr>
</table>
</div>
<hr style="clear: both;" />
<table border="1" cellpadding="3" cellspacing="0">
<caption style="font-weight: bold;">All Routes</caption>
<tr class="header">
<th>Matches Current Request</th>
<th>Url</th>
<th>Defaults</th>
<th>Constraints</th>
<th>DataTokens</th>
</tr>
<tr><td><span style="color: #c00">False</span></td><td>{resource}.axd/{*pathInfo}</td><td>(null)</td><td>(empty)</td><td>(null)</td></tr><tr><td><span style="color: #0c0">True</span></td><td>{controller}/{action}/{id}</td><td>controller = Home, action = Index, id = UrlParameter.Optional</td><td>(empty)</td><td>(empty)</td></tr><tr><td><span style="color: #0c0">True</span></td><td>{*catchall}</td><td>(null)</td><td>(null)</td><td>(null)</td></tr>
</table>
<hr />
<h3>Current Request Info</h3>
<p>
AppRelativeCurrentExecutionFilePath is the portion of the request that Routing acts on.
</p>
<p><strong>AppRelativeCurrentExecutionFilePath</strong>: ~/</p>
</div>
</div>
I notice that his appended markup begins with an <html>
tag. Does the presence of this tag somehow validate the location of this content?
No, it's not OK, but browsers are very forgiving with bad HTML.
Try http://validator.w3.org/ to see if a document is valid HTML or not (it isn't).
Pages that are well-formed (correct sequencing, opening and closing of tags) load faster and make end-users happier. It is good taste and good manners to use proper HTML, preferably when possible XHTML. Do this, and you will win friends and influence people.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With