Wanneer je start met unit testing, zijn er diverse handvaten die je kunt gebruiken om unit testing te gebruiken in je applicaties.
In de test logica mag je geen gebruik maken van
- IFs statements
- Switch of case statements
- Vervolgens moet de test code die je opstelt herhaalbaar uitgevoerd kunnen worden.
- Vermijd Multiple Asserts.
- Integration test en een unit test moet je scheiden
Alle testen in de solution runnen, wanneer een test failed dan is er een probleem. Dus -> betere test
-> integration test
-> er is geen configuratie maar je moet de test vertrouwen
Een verschil tussen een unit test en integration test is dat bij een integration test configuration noodzakelijk is. (gebruik de postfix unittest en integrationtest voor de desbetreffende testen)
Bij 'gewone' code geldt al gebruik GEEN magic numbers, en dit gaat ook op voor test code.
Syntax method names (bij testen
- method name
-state undertest
- expected behavior
-> dat leidt tot 'Add_LessThanZero_ThrowException'.
Helper methods
- '_make' -> create
- '_change' -> update
- '_assert_'
- Alleen public testen. DIt is een contract naar buiten toe. Private/protected is voor intern gebruik en meer verandelijk.
- Incremental work! (stapje voor stapje)
- [setup] attribut, dit is uitgevoerd voor ELKE test
- start een fail test, de test mag niet blijven 'falen' als de productie code is aangepast
- TDD -> vind de bugs sneller
- Simple code kan bugs bevatten
- Test names zijn lang maar dit is readabily (documentatie)
- Duplicated de logic in de test is een probleem, je test de logica niet. Het eindresultaat is niet gecontroleerd de bug wordt gewoon opnieuw gecreereerd in de Assert.AreEqual. Unittest mag geen logica bevatten, zelfs geen string.Format etc.
- Verander nooit een test. Als een test niet goed is (failuing test). Tegenstrijdige requirements vraag na welke requirement geldig is.
- Code coverage
Tuesday, December 29, 2009
Unit testing losse flarden
Saturday, November 7, 2009
SQL datetime headaches
Usefull page for that
But it did not realy have what i wanted from it.
So the final solution was the following
to get a format like this:
2008-11-13 17:29:00
SET generated = cast( getdate() - 8 as smalldatetime)
WCF service error contract name not found
solution on the blog of Peter Morris:
The contract name xxxxxxx could not be found in the list of contracts implemented by the service
So what you need to do:
Check names of interfaces
Check namespaces
Check the service attributes ([AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)])
What is Inversion of control and Dependency injection
And we where using some of the terms often related to this topic and it was confusing me. I decided to get my facts straight.
the principle comes down to the following:
A Control gets all his data and events from the outside and itself does not know anything about the context it is being used in. This results in lousely coupled Code/controls which in turn should make them more reusable.
http://www.codeproject.com/KB/aspnet/IOCDI.aspx
Conlusion
Inversion of control is a principle with the goal to help you create better, more reusable code
Dependency injection is a specific method of achieving inversion of control.(Unity is a method for dependency injection)
Path resolution through IUrlResolutionService
When working on a project at work i saw a colleage use the following interface
IUrlResolutionService
I had never seen that one before and i looked it up
MSDN page
Quote from the page:
Defines a service implemented by objects to resolve relative URLs based on contextual information.
....
This interface defines the service that is used to resolve URL paths. The IUrlResolutionService interface is used for resolving relative paths and paths that contain the ~ operator. Server controls that reference resources can define the paths to the resources through the ~ operator, which represents the root of the current application. A path containing the ~ operator will not work if passed to the browser. The server control must convert the path to an absolute or relative path before passing it to the browser.
Control implements this interface. A control that derives from Control could override this implementation to provide customized resolution of URLs.
you can pass along controls or the page deeper into your code using this interface to resolve app relative paths for you. For example "~/foo/bar.aspx" would get resolved properly by the control to a path the client can use based on the current context of the control/page.
I myself are using this more often these days it seems a nice way to do it.
Steps until failure
on Found on the website:
http://odetocode.com/Blogs/scott/default.aspx
void Process(){
Func<bool>[] steps = {
Step1,
Step2,
Step3,
Step4,
Step5
};
}
void ExecuteStepsUntilFirstFailure(IEnumerable<Func<bool>> steps)
{
steps.All(step => step() == true);
}
The All operator is documented as stopping as soon as a result can be determined, so the above code is equivalent to the following:
void ExecuteStepsUntilFirstFailure(IEnumerable<Func<bool>> steps)
{
foreach (var step in steps)
{
if (step() == false)
{
break;
}
}
}
Thursday, October 29, 2009
Environment.NewLine
When you create a string with must have multiple line use the option Environment.NewLine and not the escape characters.
see
Friday, October 23, 2009
Some Anti campaigns
- Reduce FOR
- Reduce IF.
Convert VB.NET to C#
On this site some links can be found, for quick links for converting VB.NET to C# and vice versia.
Further there are some difference between those two languages. Some of these differences can be readen here.
Nested repeater programmatically
Create PDF in ASP.NET
Tuesday, October 13, 2009
Tip: Linq to SQL
I mostly use Linq to Objects, but when I am going to use Linq to Sql is will read these tips again:)
Monday, October 12, 2009
Tool SourceCodeOutliner
I am not yet using it. But I think I will give it a try for a couple of weeks.
Sunday, October 11, 2009
.NET Versions
In the next switch statement an example of using the Version property:
switch(System.Environment.Version.ToString())
{
case "1.0.3705.000" :
{
Response.Write(" (.NET 1.0)");
break;
}
case "1.0.3705.209" :
{
Response.Write(" (.NET 1.0 SP1)");
break;
}
case "1.0.3705.288" :
{
Response.Write(" (.NET 1.0 SP2)");
break;
}
case "1.0.3705.6018" :
{
Response.Write(" (.NET 1.0 SP3)");
break;
}
case "1.1.4322.573" :
{
Response.Write(" (.NET 1.1)");
break;
}
case "1.1.4322.2032
Overview of .NET versions from the Framework.
Friday, October 9, 2009
Reading attribute with ConfigurationElementCollection
I was programming a part of a configuration file like this
I will use the ConfigurationElementCollection.... so the
But getting the value of the title attribute on the
Wednesday, October 7, 2009
Google Webelements
With Google Webelements you can create a web element for your web site. On the page you can customize the web element and when you have entered all the settings you simply copy the html in your web site and your web element can be used on your web site.
Design conventions properties and methods
On the blog of Wesley Bakker I have read the following article. Most of this stuff is really basic, but it is always usefull to repeat this. So conform your code to the design conventions for properties and methods, when you do not some other developers which use your code can make wrong assumptions.
Monday, October 5, 2009
XMLSerializer and invalid XML
On the blog of Raj Kaimal I have read the following article about xml serialization.
The conclusion of this article is the existence of the System.Xml.XmlWellFormedWriter class which can be created with the XmlWriter.Create method.
Thursday, October 1, 2009
New Ajax Toolkit
In this article some new controls of the new ajax toolkit
Download the new release here:
http://ajaxcontroltoolkit.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=33804
Try the live demos here:
http://www.asp.net/ajax/ajaxcontroltoolkit/samples/
Friday, September 25, 2009
Configure test projects in Visual Studio
I have not done anything reals with test projects in Visual Studio but on Platinum Bay there are some options for configuring the test projects in Visual Studio.
Friday, September 11, 2009
.NET Framework 1.1. on Vista
When you want to install and use the .NET Framework 1.1. on a PC where Vista is installed read the following article.
Reset auto number from a SQL table after delete
When you have an auto number on a table and you deletes the rows in the table you have to reset the autonumber value.
DELETE FROM tblName
DBCC CHECKIDENT (tblName,RESEED, 0)
The first lines throws all the rows in tblName away and with the second row the auto number is reset
read here more information
Thursday, September 10, 2009
Fill a dropdown with month names
Tuesday, September 1, 2009
VS2010: Multi monitor
Friday, August 28, 2009
Fun flow diagram
I have found a very funny flow diagram on xkcs. In this diagram non-computer people gets some instructions what do to when they getting an error on the pc BEFORE calling 'computer experts'.
Tuesday, August 25, 2009
.Root in Source Safe
You are running into a feature referred to as 'Solution Root' added
to VS2003 (and carried forward into VS2005). You can disable this behavior
via the following registry entry:
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\SourceControl\DoNotCreateSolutionRootFolderInSourceControl
Builder versus Factory pattern
Difference Between Builder pattern and Factory pattern
The factory pattern defers the choice of what concrete type of object to make until run time. E.g. going to a restaurant to order the special of the day. The waiter is the interface to the factory that takes the abstractor generic message "Get me the special of the day!" and returns the concrete product (i.e. Hawaiian or Spicy pizza)
The builder pattern encapsulates the logic of how to put together a complex object so that the client just requests a configuration and the builder directs the logic of building it. E.g The main contractor (builder) in building a house knows, given a floor plan, how to execute the sequence of operations (i.e. by delegating to subcontractors) needed to build the complex object. If that logic was not encapsulated in a builder, then the buyers would have to organize the subcontracting themselves ("Dear, shouldn't we have asked for the foundation to be laid before the roofers showed up?")
The factory is concerned with what is made, the builder with how it is made. Design patterns points out that Abstract factory is similar to builder in that it too may construct complex objects. The primary difference is that the Builder pattern focuses on constructing a complex object step by step. Abstract factory's emphasis is on families of product objects (either simple or complex). Builder returns the product as the final step, but as far as the Abstract Factory is concerned, the product gets returned immediately.
_Blank variant
<a onclick="window.open(this.href,'_blank');return false;" href="http://some_oother_site.com">Some Other Site</a>
TemplateSourceDirectory invisible
new public virtual string TemplateSourceDirectory
{
get
{
return Page.TemplateSourceDirectory;
}
}
Now the property is invisible for other classes.
Set time-out-time
Time out exceptions. How can the 'time-out-time' be set in a WCF service, web service or for (SQL) database.
Monday, August 24, 2009
SQL injection prevention
How to prevent your application from SQL Injection.
Thursday, August 20, 2009
Not showing a login page
SEO: Viewstate on top
In Place Editing
On Misfit Geek there is a nice startup tutorial about Inplace editing.
Redirect Session Expiration
I have not yet used this, but it seems nice to integrate this in a webapplication which uses form authentication.
more info
Wednesday, August 19, 2009
Serialization in ASP.NET (2)
Simple example for serializing and deserializing
Web Site or Web Application
- a web application project
- a web site project (introduced in VS2005)
Some links with information about this discussion
- ASP.NET Resources - Web Site vs Web Application Project (WAP)
- ASP.NET Web Site Layout
- asp.net Web Site versus Web Application Project
- ASP.NET Website vs Web Application project
- Understanding Page Inheritance in ASP.NET 2.0 - Rick Strahl's Web Log
- Web Site or Web Application - Blog
- Website versus Web Application - Durban, South Africa
But the conclusion of most of these sites is: decide it by yourself!
Convert Website to Webapplication
here some instructions for doiing this.
Parameters queries in Access
Tabs in Jquery
I have sent a comment with the questing how to navigate directly to a specific tab? Example of navigate directly to a specific tab
Only IE7 in IE8
<meta http-equiv="X-UA-Compatible" content="IE=7" />
Monday, August 17, 2009
Escaping xml data
Sunday, August 2, 2009
String.Empty vs empty quotes vs String.Length
The usage of String.Empty is more efficient that the usage of empty quotes.
When using empty quotes an object is created and this produces more assembly code on the execution stack and for string.Empty is NO object created.
The usage of String.Length == 0 is the best. Now there is a numeric compare applied instead of a string compararision, and numeric compare is quicker.
Only what if the string has the value null? So use string.IsNullOrEmpty method
More info: C# Shiznit, Vikram's Blog
Throw; versus Throw e;
In Coding Standards is the differents between throw and throw e explained.
What is the difference?
The difference is that 'throw;' the original stack trace persists and 'throw ex' truncates the stack trace after the method where the 'throw ex;' is called.
When using 'throw;'?
When in the try{...} a method is called then you must use 'throw;' to take care that you have the original stack trace.
Example:
// Bad!
catch(Exception ex)
{
Log(ex);
throw ex;
}
// Good!
catch(Exception)
{
Log(ex);
throw;
}
Another alternative is to create a new Exception and pass the current exception as inner exception. The stack trace is shown correctly (complete)
Example:
// Bad!
catch(Exception ex)
{
Log(ex);
throw ex;
}
// Good!
catch(Exception)
{
Log(ex);
Throw new NotImplementedException(“some extra information”, ex);
}
See for more information Fabrice's weblog, Signs on the Sand, Joteke's Blog
String.Compare or String.ToLower
// Bad!
Example: (ToLower() creates a temp string)
int id = -1;
string name = "lance hunt";
for(int i=0; i < customerList.Count; i++)
{
if(customerList[i].Name.ToLower() == name)
{
id = customerList[i].ID;
}
}
// Good! (but not for all cultures)
int id = -1;
string name = "lance hunt";
for(int i=0; i < customerList.Count; i++)
{
// The “ignoreCase = true” argument performs a
// case-insensitive compare without new allocation.
if(String.Compare(customerList[i].Name, name, true)== 0)
{
id = customerList[i].ID;
}
}
// Good! (now also for all cultures)
int id = -1;
string name = "lance hunt";
for (int i = 0; i < customerList.Count; i++)
{
// The StringComparison.OrdinalIgnoreCase argument performs a
// case-insensitive compare without new allocation and for several cultures.
if (String.Compare(customerList[i].Name, name, StringComparison.OrdinalIgnoreCase) == 0)
{
id = customerList[i].ID;
}
}
Een leuke referentie is de zogenaamde Turkey Test.
Monday, July 27, 2009
Countries depending CurrentCultureInfo
Wednesday, July 1, 2009
Refactoring methods
I try myself to read this list and also use this list during programming. And when I optimize some code fragment I want to realize that I am using one of these refactoring methods.
Thursday, June 25, 2009
Byte array
LINQ: Join
On Erwin's Blog you can read an example.
Tuesday, June 9, 2009
LINQ: Debug Visualizer
On the blog of Scottgu you will find some instructions for installing a Linq to SQL debug visualizer. With this visualizer installer you can see the relating SQL queries for the Linq statements.
Monday, June 8, 2009
Friday, June 5, 2009
SEO Toolkit
Update 15 july 2009: Nice results of SEO Toolkit.
Thursday, May 28, 2009
Link dump: Exception Handling
So here some links which provide me some information to get some more information about this subject. And most important how can you add exceptions into an existing application?
General information:
- codeproject User Friendly ASP.NET Exception Handling. Free source code and programming help
- elmah - Google Code
- How to send email in HTML format with Microsoft Enterprise Library - Stack Overflow
- Rich Custom Error Handling with ASP.NET
- Using HTTP Modules and Handlers to Create Pluggable ASP.NET Components
- Try{refactoring();}catch{return null;} - Doron Goldberg
Webservice:
Tuesday, May 26, 2009
VS2010: Regular Expression Editor
I have not yet installed it on my PC, but I have read about the Regular Expression Editor and I found a Code plex: Editor Samples so maybe you can use this in the near future.
How to start with Unit Testing?
So there are several blog items about Unit Testing, see
Unit Testing ASP.NET ASP.NET unit testing has never been this easy - Stefan Sedich's Blog. But what is the best way to start.
Can someone give me a good suggestion?
Update 16 july 2009: I have found a nice list with suggestions on Bugfree.
Browser backbutton in ASP.NET
A back button for asp.net pages - Peter's Gekko - CodeBetter.Com - Stuff you need to Code Better!
ASP.NET Browser Back Button - Overclockers Australia Forums
Avoid Back button after logout. - ASP.net - Dotnet Fusion
back button of browser compitible with asp.net application - bytes
dotnetslackers Back Button in ASP.NET
Monday, May 25, 2009
Resource editors
The Zeta Resource Editor is a Windows Tool and a Web Tool
Also a useful add-in is the automatically add to resource
Thursday, May 7, 2009
LINQ: Any() or Count()
When you have a collection and you want to check if there are items in the collection you can do this
Codefragment 1:
if (lCollection.Count() > 0) {
// do something
}
Codefragment 2:
if (lCollection.Any()) {
// do something
}
When the collection is also an ICollection the Count property is returned otherwise the collection is enumerated an counted for each element. The last one is an expensive operation.
The Any() method begins to iterate over the collection and stops when the condition is true. If you use the variant without the condition, the method iterates over the first element and stops. So code fragment 2 is a better solution qua performance.
LINQ and Deferred Execution
article and hopefully I will reminder it this time.
Wednesday, May 6, 2009
Difference between Convert.ToBase64String and HttpServerUtility.UrlTokenEncode?
There are two methods for converting a string to a Base64 value:
But what is the exact differnce between them? And when do you decide the use the Convert or the Encode?
When you are going to transmit a value via a URL the method to use is the: HttpServerUtility.UrlTokenEncode() method,
This method creates a url safe value.
The original base64 string encoding follows a standard definition which uses the following characters:
From:
http://www.ietf.org/rfc/rfc1421.txt
Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
Printable Encoding Characters
Table 1
As you can see there are a few characters in this set that are already used in normal urls. To create url save string the +, / and = characters are substituted for other tokens to create a value which is usable in a URL.
The System.Convert.ToBase64 does not display this behavior which might result in a value which isn't usable in a URL, So when you Encode a value to base64 data which you are going to use in a url use HttpSeverUtility.UrlTokenEncode to create safe values
Friday, May 1, 2009
Clipboard Ring
With CTRL+SHIFT+V can you browse through the Clipboard Ring.
Events in (Web)UserControls
I am a big fan of using (Web)UserControls, but often I forgot to use events... so may be I go use them more now;)
Webpage in the center of the screen
Html Snippet for creating a webpage in the center of the screen without tables.
Maybe there a better suggestions?
DateFormatting overview
Design Pattern: Lazy Loading
The term Lazy Initialisation was known and that is a part of Lazy Loading. So in a property check if the field is not null and only when the field is null do your job.
Wednesday, April 15, 2009
Resharper 4.5 Released
There is a new version released: "ReSharper 4.5 is more agile and robust than ever, with improved performance, memory usage and solution-wide analysis, as well as VB9 support"
I will report my experiences soon...
Update 22 april: I am using Resharper 4.5 a few days and it is really faster in VB.NET:) Further it is nice that the intellissence gives some suggestions for usage of fields-, variables names and so on. The rules for these name can defined by your own.
Tuesday, April 14, 2009
Always comment your code...
book about debugging and there was a very important part about commenting... I have summarized the following points:
Always document:
- your assumptions
- your approach
- the reasons why you have choosen for this approach
For each function or method:
- what does the routine?
- which assumptions have you made?
- what does every in- and output param contains?
- what are all the posssible return values or the routine?
- document every exception which is directly thrown in this routine
Always document bugfixes which you have made during development. (when available write down the bug number or reference where more information can be found about the bug/solution)
Always throw commented code away, because it is not clear what the meaning is of this in five years...
Always improve your code when you think "This is a hack"
Xml Comments
copied from winnershtriangle
exception: The exception tag allows a method's exception handling to be documented. The cref attribute allows the namespace of the exception handler to be included. Example:
permission: The permission tag can be used to describe any special permissions a specific object needs. The object to which the permission refers is included as the cref attribute. Example: Class needs to write to the file system, ensure user has appropriate access.
Run Kiss Llama on port 8000
But with LlamaKiss I still can watch movies from my KISS on TV.
But the programm doesn't start because there was already some other programm running on port 8000. The program starts with the following message "Error 10048: Only one usage of each socket address (protocol/network address/port) is normally permitted". You can analyse this with the command "netstat -a -b" from the command prompt.
Saturday, April 4, 2009
Tips for debugging in Visual Studio
I have not yet read them all... so I have no my best tips:)
UML associations
Association: The object which have a relation with eachother are equal. For example a person drives a car.
Aggregation: One object is owner of the other object. For example a department and a person which is 'chief of the deparment'
Composition: One object is owner of the other object. But when the owner is deleted to other object is useless. For example a Room belongs to a house. When the house is destroyed the room doesnot exists anymore.
See for more details Wikipedia
ResolveUrl vs. ResolveClientUrl
The difference between them is clear to me, but I do not yet really understand when to use the ResolveUrl instead of the ResolveCleintUrl...
Friday, March 6, 2009
C# 4.0: Named arguments, optional arguments, and default values
On Sam Ng's Blog there is an article about a new feature in C#4.0: Named arguments, optional arguments, and default values
Wednesday, March 4, 2009
Test your website in mulitple browsers
On this blog there are some links for starting several browsers without installing them really on your system.
So you can easily test if your web site works well in the different versions of for example IE.
Serialization in ASP.NET
Serialization...it's difficult... but maybe with these links it makes it easier to use and not avoid. This blog provide some information about serialization. Also there is a link available to some FAQ's
Friday, February 27, 2009
Usage of keyword module?
During looking in the VB.NET code of my new Job I saw sometimes the keyword module. This keyword doesnot exist in C#.NET. The meaning of this keyword is the same as a class only all the members and methods are default shared. So the developer can become lazy;)
So my advise is to minimize the usage of the keyword module and use always the keyword class.
Friday, February 20, 2009
Some introduction links for Unity
From an previous colleague I have received the following links with some information about unity:
Reageer op externe events in plaats van zelf de touwtjes in de hand te houden. or the English variant “Don’t call us we will call you”
Thursday, February 19, 2009
How to nest web user controls dynamically?
When you use nested Web User Controls and you load them with the LoadControl method, add these controls in PlaceHolder.Controls collection (or other controls except the Page class)
Example code
wucMain.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
wucSub lMain = (wucSub)Page.LoadControl("Windows/wucSub.ascx");
Controls.Add(lMain);
}
wucMain.aspx
<strong>Main</strong><br /><asp:ListBox runat="server" ID="lstItems" />
wucSub.aspx.cs
no code behind
wucSub.aspx
<strong>Main</strong><br /><asp:ListBox runat="server" ID="lstItems" />
Test.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
wucMain1 lMain = (wucMain1)Page.LoadControl("Windows/wucMain.ascx");
Controls.Add(lMain);
}
Test.aspx
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
When you build and run these pages, you will get the following error message
"Control 'ctl02_lstItems' of type 'ListBox' must be placed inside a form tag with runat=server."
How can you solve this?
Do not use Page.Controls.Add or Controls.Addd but specify to which Controls collection these these controls must be added and use there a PlaceHolder (panel or other control). So the correct implemention will be
wucMain.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
wucSub lMain = (wucSub)Page.LoadControl("Windows/wucSub.ascx");
plhSub.Controls.Add(lMain);
}
wucMain.aspx
<strong>Main</strong><br /><asp:ListBox runat="server" ID="lstItems" /><asp:PlaceHolder runat="server" ID="plhSub" />
wucSub.aspx.cs
no code behind
wucSub.aspx
<strong>Main</strong><br /><asp:ListBox runat="server" ID="lstItems" />
Test.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
wucMain1 lMain = (wucMain1)Page.LoadControl("Windows/wucMain.ascx");
plhMain.Controls.Add(lMain);
}
Test.aspx
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:PlaceHolder runat="server" ID="plhMain" />
</div>
</form>
</body>
</html>