Monday, September 14, 2009
Old Skool - Classic ASP ServerVariables List
Tuesday, September 01, 2009
Useful code to properly record and redirect an unhandled exception from Global.asax Application_Error Handler
void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs
string httpCode = ((HttpException) Server.GetLastError()).GetHttpCode().ToString();
if (HttpContext.Current.Session != null)
{
HttpContext.Current.Session["LastError"] = Server.GetLastError();
Server.ClearError();
}
switch (httpCode)
{
case "404":
Response.Redirect("/Error/Error404.aspx");
break;
default:
Response.Redirect("/Error/Error.aspx");
break;
}
}
Wednesday, August 12, 2009
GridView (non-object/sql DataSource) Paging and Sorting
This is just a quick reminder post about how to do things and in what order to get Paging and Sorting working together on a GridView Control when you’re datasource is NOT a SqlDataSource or ObjectDataSource reference by DataSourceId in the ASPX file but rather a (collection of) POCO objects or other datasource!
.ASPX file
<asp:GridView CssClass="tableStyle1" HeaderStyle-CssClass="bgA" RowStyle-CssClass="bgB"
DataKeyNames="Id" AlternatingRowStyle-CssClass="bgB" AllowPaging="true"
AllowSorting="true" PageSize="50" OnPageIndexChanging="ResultsGrid_PageIndexChanging"
AutoGenerateColumns="false" runat="server" ID="ResultsGrid" OnRowDataBound="ResultsGrid_RowDataBound"
OnSorting="ResultsGrid_Sorting" PagerStyle-ForeColor="White">
<Columns>
<asp:BoundField DataFi
.CS file
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
ViewState["SortExpression"] = "Title";
ViewState["SortDirection"] = "ASC";
}
}
public void ResultsGrid_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
ResultsGrid.PageIndex = e.NewPageIndex;
BindResultGrid();
}
private void BindResultGrid()
{
SqlDataAdapter da = new SqlDataAdapter("ReportingSelect", new SqlConnection(connectionString));
GetSqlParametersForFilter(PrepareFilterTerms(), da.SelectCommand);
DataSet results = new DataSet();
da.Fill(results);
ResultsGrid.DataSource = ApplySorting(results.Tables[0].DefaultView);
ResultsGrid.DataBind();
}
private DataView ApplySorting(DataView dataViewForSorting)
{
dataViewForSorting.Sort = ViewState["SortExpression"].ToString() + " " + ViewState["SortDirection"].ToString();
return dataViewForSorting;
}
public void ResultsGrid_Sorting(object sender, GridViewSortEventArgs e)
{
if (e.SortExpression.ToString() == ViewState["SortExpression"].ToString())
{
if (ViewState["SortDirection"].ToString().StartsWith("ASC"))
{
ViewState["SortDirection"] = "DESC";
}
else
{
ViewState["SortDirection"] = "ASC";
}
}
else
{
ViewState["SortExpression"] = e.SortExpression.ToString();
if (e.SortDirection == SortDirection.Ascending)
{
ViewState["SortDirection"] = "ASC";
}
else
{
ViewState["SortDirection"] = "DESC";
}
}
BindResultGrid();
}
Monday, August 03, 2009
ASCII Encoded/Binary String Automated SQL Injection Attack
http://www.bloombit.com/Articles/2008/05/ASCII-Encoded-Binary-String-Automated-SQL-Injection.aspx
///
...
private static string[] SQLKeywords = new string[]
{
"EXEC", "SELECT", "INSERT", "UPDATE", "DELETE",
"CAST", "DECLARE", "NVARCHAR", "VARCHAR"
};
...
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
if (context != null)
{
string queryString =
context.Request.ServerVariables["QUERY_STRING"];
if (string.IsNullOrEmpty(queryString) == false)
{
if (queryString.Length > 500)
throw new SQLInjectionException(string.Format("Unexpected 'QUERY_STRING' length ({0}).", queryString));
queryString = Server.UrlDecode(queryString);
queryString =
queryString.Replace(" ", string.Empty).ToUpper();
foreach (string keyword in SQLKeywords)
{
if (queryString.IndexOf(keyword) != (-1))
throw new SQLInjectionException(string.Format("Unexpected T-SQL keyword ('{0}') has been detected ({1})", keyword, queryString));
}
}
}
}
...}
My 30th birthday is looming....
Stuff I’d Like for my Birthday:
Framework Design Guidelines: Conventions, Idioms, and Patterns for re-useable .NET Libraries 2nd Edition, Book/DVD Package
http://www.compman.co.uk/scripts/browse.asp?ref=895703
£22.34
Hitman DVD – Unrated
http://www.movietyme.com/catalog/product_info.php?products_id=39063&osCsid=dd991dc5d4a98e3f30952bf39550ad0c
£15.99
HMV Vouchers!
Iomega 1TB desktop hard drive - Catalogue number: 204-6510
http://direct.tesco.com/q/R.204-6510.aspx
£69.94
Philips SPC1330NC Webcam pro
http://shop.philips.co.uk/servlet/ControllerServlet?Action=DisplayProductDetailsPage&Locale=en_GB&SiteID=rpeeub2c&productID=124455100&s_kwcid=TC9368philips%20spc1330ncS3385570448
£69.99
Subscription to WebUser Magazine
http://www.magazinesubscriptionsipc.com/ipc/subs/subsorder.asp?title=XWU&promcode=i272&ctryID=NONE
About £25 I think
CLR via C#, 3rd Edition by Jeffrey Richter (I’ve already got the 2nd Edition)
Not out yet!
£TBC
Hanns-G 22in HG221AP Wide LCD TFT Black/Silver MonitorMonitor
http://www.svp.co.uk/displays/monitor-22-hanns-g-22-hannsg001_monitor.html
£109.62
Thursday, June 04, 2009
Wednesday, June 03, 2009
Thursday, May 28, 2009
Neighbours' shock as cows invade housing estate - Rugby Today - Back to Home Page: "Neighbours' shock as cows invade housing estate"
Friday, May 15, 2009
Questionnaire table links to Questions table, Questions table links to QuestionLinking table (Where a dependancy between one question and another is held) and so forth. I spent a while looking for a "clean" solution but the only option I found was to iterate through each Questionnaire, Question and Question link at a time as I needed to update the QuestionnaireId, QuestionId and QuestionLinkId from the Source Questionnaire to the Destination Questionnnaire row equivalents... if you have any patterns or approaches tot his type of thing not involving cursors I would love to hear from you!
How to use SQL Server T-SQL cursors Microsoft SQL Server Advisor
Wednesday, May 06, 2009
Tuesday, December 11, 2007
HITMAN THE MOVIE
lesser extent) were all, well, not to be unkind but quite poor. So by that benchmark given the genre anything better than quite poor is a big plus. OK, so nmow we have a general benchmark lets consider some other mitigating factors - whilst Hitman has some superb stunts, special
effects and action sequences you should not go to this film with "This is another Borne Identity/James Bond type of film", it not, firstly the main character is more reminiscent of Leon than either of the two previously mentioned, think World Cinema, Darkened Eastern
European/Russian location, think World Cinema with a bigger budget. There are also some nice "in jokes" - at one point Agent 47 crashes thru a window into a hotel room with two kids playing Hitman the game on the telly - quite amusing if you catch the reference. Now the leading lady
isn't your typical "Bond Girl" shes dark, damaged, sassy and gothic AND she appears partially naked now and again - in my book all these things make her much more intriguing and interesting and indeed more sexy than anything the Bond franchise has produced. The main character IS NOT A "GOODIE" as with Borne and Bond, this guy has been trained from birth to be an assassin and it is his sole purpose, no sleeping with anything that moves, no witty repartee just a case full of weaponry and some bad-ass hand to hand combat get this guy thru life. The gadgets whilst fanciful in places have at least the potential to exist and are generally believable and used judiciously. Personally I thought that this film was one of the best Ive seen so far this year and, even if you don't go and see it at the cinema its certainly worth a rental - especially if you have surround sound and a hi-def telly to enjoy all the gun fights and explosions! Its efinitely a lads movie but not so much your "I like guns and stuff blowing up me" type of lad film more a "Im interested in see some alternative characters play out an intercontinental game of cat and mouse with high violence and some reasonable character development". The leading man, though Ive forgotten his name, must have been able to memorise his lines in an afternoon - he remains mostly silent throughout the film, punctuated occaisionally by some direct instruction which generally either ends or saves someones life, this guy however is not devoid of character, you are left with the distinct impression that theres a world of torment and angst behind those eyes and that whilst he never expresses it in words his facial reactions say it all whilst giving away nothing!
All in all a FIVE STAR film - SEE IT NOW!
Wednesday, November 28, 2007
Javascript Goodies
I’ve recently had to deal with some very run of the mill client side validation, namely validation a comma separated list of email addresses – I was so pleased with my cobble together of bits of code I found on the net that I thought Id post it here for the next time! Also a handy bit of script to “trim” a string in javascript and adding the trim method to the String object… NICE!
String.prototype.trim = function() { return this.replace(/^\s+\s+$/g, ''); }
function CheckEmailAddresses()
{
var recipients = document.getElementById('recipients').getAttribute('innerText').split(',');
var emailRegEx = /^(("[\w-\s]+")([\w-]+(?:\.[\w-]+)*)("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)(@\[?((25[0-5]\.2[0-4][0-9]\.1[0-9]{2}\.[0-9]{1,2}\.))((25[0-5]2[0-4][0-9]1[0-9]{2}[0-9]{1,2})\.){2}(25[0-5]2[0-4][0-9]1[0-9]{2}[0-9]{1,2})\]?$)/i
for (var email in recipients)
{
if(emailRegEx.test(recipients[email].trim()))
{
alert('good');
} else {
alert('bad');
}
}
}
Thanx go to the following locations:
Trim function: http://www.nicknettleton.com/zine/javascript/trim-a-string-in-javascript
Email Regex: http://xyfer.blogspot.com/2005/01/javascript-regexp-email-validator.html
Monday, April 30, 2007
The Brooba Revolution!
http://www,brooba.com
Monday, March 05, 2007
New Website
Cheers!
Tuesday, August 01, 2006
Javascript - Strpping CrLf
.replace(/(\r\n)/g, "<br/>");
Tuesday, July 11, 2006
ASP.NET Web.Config from IIS
Tuesday, July 04, 2006
RSS XML Stylesheet Example
Some time ago I was working for a client who required their CMS system to output particular items as RSS feeds. The CMS output XML and used XSLT to tranform to HTML. This provided a very handy mechanism indeed for conversion to RSS.
My final solution used a stylesheet to simply take the XML from the CMS and convert it to an RSS 2.0 format feed rather than HTML! Below I have rewritten the stylesheet (adding a few flourishes) which should be easily adaptable and fairly generic for this type of conversion as long as the XML provides the following attributes in a fairly sensible format!
XML Needs to contain the following items for the feed:
TITLE OF FEED
LINK TO FEED HOMEPAGE
DESCRIPTION OF FEED
COPYRIGHT NOTICE
TITLE OF ARTICLE
LINK TO ARTICLE
DESCRIPTION OF ARTICLE
CREATOR OF ARTICLE
DATE OF ARTICLE
An eaxmple of how the XML might look is (it might not look at all like this in which case I might advise a pre-RSS xml conversion with XSL to bring it into line with the below and separate the XML conversion code form the XML-RSS code):
<data>
<feed title="" link="" description="" copyright="">
<item>
<title></title>
<link></link>
<description></description>
<creator></creator>
<date></date>
</item>
<item>
<title></title>
<link></link>
<description></description>
<creator></creator>
<date></date>
</item>
<item>
<title></title>
<link></link>
<description></description>
<creator></creator>
<date></date>
</item>
</feed>
</data>
And finally the actual stylesheet - obviously this could easily be extended to manage multiple feed xml but if I did it all here it'd take the fun out of it!
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="no" encoding="unicode" omit-xml-declaration="yes" media-type="text/xml"/>
<xsl:template match="data">
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>TITLE OF FEED</title>
<link>LINK TO FEED HOMEPAGE</link>
<description>DESCRIPTION OF FEED</description>
<language>en-gb</language>
<dc:rights>COPYRIGHT NOTICE</dc:rights>
<xsl:for-each select="ITEMNODESET">
<item>
<title>TITLE OF ARTICLE</title>
<link>LINK TO ARTICLE</link>
<description>DESCRIPTION OF ARTICLE</description>
<dc:creator>CREATOR OF ARTICLE</dc:creator>
<dc:date>DATE OF ARTICLE</dc:date>
</item>
</xsl:for-each>
</channel>
</rss>
</xsl:template>
</xsl:stylesheet>
XSLT Replace Template
<xsl:template name="replace">
<xsl:param name="string" select="." />
<xsl:choose>
<xsl:when test="not($string)" />
<xsl:when test="contains($string, ';')">
<xsl:value-of select="substring-before($string, ';')" />
<br />
<xsl:call-template name="replace">
<xsl:with-param name="string" select="substring-after($string, ';')" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$string" />
<br />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
All you need do is call the template and pass your input into with $string param, in my case this was the ";". Then replace the <br/> tags with whatever you need to replace your input string with - easy!