ASP.NET 4+ Overview
Alvin Lau
Solutions Consultant, Datacraft
MVP (ASP.NET/IIS) since Jul 2005
SGDOTNET Council Member
ASP.NET 4+ Overview
• Advancements in ASP.NET 4.0
• ASP.NET MVC 3.0
• Questions and Answers
Agenda
Advancements in ASP.NET 4.0
Advancements in ASP.NET 4.0
• Core Services
• Ajax
• Web forms
• Dynamic Data
• Web Application Deployment
Overview
Advancements in ASP.NET 4.0
Web.config file refactoring
Extensible Output Caching
Core Services
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation targetFramework="4.0" />
</system.web>
</configuration>
<caching>
<outputCache defaultProvider="AspNetInternalProvider">
<providers>
<add name=“DiskCache”
type="Test.OutputCacheEx.DiskOutputCacheProvider, DiskCacheProvider"/>
</providers>
</outputCache>
</caching>
<%@ OutputCache Duration="60" VaryByParam="None" providerName="DiskCache"
%>
public override string GetOutputCacheProviderName(HttpContext context)
{
if (context.Request.Path.EndsWith("Advanced.aspx"))
return "DiskCache";
else
return base.GetOutputCacheProviderName(context);
}
Advancements in ASP.NET 4.0
Auto-start
Core Services
(applicationHost.config)
<applicationpools>
<add name="MyApplicationPool" startMode="AlwaysRunning" />
</applicationpools>
<sites>
<site name="MySite" id="1">
<application path="/"
serviceAutoStartEnabled="true"
serviceAutoStartProvider="PrewarmMyCache" >
<!-- Additional content -->
</application>
</site>
</sites>
<!-- Additional content -->
<serviceautostartproviders>
<add name="PrewarmMyCache"
type="MyNamespace.CustomInitialization, MyLibrary" />
</serviceautostartproviders>
public class CustomInitialization :
System.Web.Hosting.IProcessHostPreloadClient
{
public void Preload(string[] parameters)
{
// Perform initialization.
}
}
Advancements in ASP.NET 4.0
RedirectPermanent helper (Issue HTTP 301 Moved Permanently
Response)
Shrinking Session State (Using System.IO.Compression.GZipStream
class)
Core Services
<sessionState
mode="SqlServer"
sqlConnectionString="data source=dbserver;Initial
Catalog=aspnetstate"
allowCustomSqlDatabase="true"
compressionEnabled="true"
/>
Advancements in ASP.NET 4.0
• Performance Monitoring (new performance counters)
– % Managed Processor Time
– Managed Memory Use
Core Services
Aspnet.config
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<runtime>
<appDomainResourceMonitoring enabled="true"/>
</runtime>
</configuration>
Advancements in ASP.NET 4.0
Open-source Jquery
– jQuery-1.4.1.js
– jQuery-1.4.1.min.js
– jQuery-1.4.1-vsdoc.js
CDN Support
Script Manager Explicit Scripts
Ajax
<script src="http://ajax.microsoft.com/ajax/jquery/jquery-
1.4.2.js" type="text/javascript"></script>
<asp:ScriptManager ID="sm1" EnableCdn="true" runat="server"
/>
<asp:ScriptManager ID="sm1" AjaxFrameworkMode="Explicit"
runat="server">
<Scripts>
<asp:ScriptReference Name="MicrosoftAjaxCore.js" />
<asp:ScriptReference Name="MicrosoftAjaxComponentModel.js" />
<asp:ScriptReference Name="MicrosoftAjaxSerialization.js" />
<asp:ScriptReference Name="MicrosoftAjaxNetwork.js" />
</Scripts>
</asp:ScriptManager>
<%@ Page Language="C#" ... >
<head runat="server">
<title>Show jQuery</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="txtFirstName" runat="server" />
<br />
<asp:TextBox ID="txtLastName" runat="server" />
</div>
</form>
<script src="Scripts/jquery-1.4.1.js"
type="text/javascript"></script>
<script type="text/javascript">
$("input").focus( function() { $(this).css("background-color",
"yellow"); });
</script>
</body>
</html>
Advancements in ASP.NET 4.0
Set meta tags
View State for Individual Controls
ViewStateMode (Enabled, Disabled, Inherit)
Web Forms
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs"
Inherits="_Default"
Keywords="These, are, my, keywords"
Description="This is a description" %>
<asp:PlaceHolder ID="PlaceHolder1" runat="server"
ViewStateMode="Disabled">
<asp:PlaceHolder ID="PlaceHolder2" runat="server"
ViewStateMode="Enabled">
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="Default.aspx.cs"
Inherits="WebApplication1._Default"
ViewStateMode="Disabled" %>
Advancements in ASP.NET 4.0
Browser Capabilities Providers
Replacing ASP.NET Browser Capabilities
1. Create provider class from HttpCapabilitiesProvider and overrides
GetBrowserCapabilities method
2. Register provider with application
– browserCaps section in web.config or machine.config
– Write code in Application_Start (Global.asax)
Caching HttpBrowserCapabilities Object (same process)
Extending ASP.NET Browser Capabilities (same process)
Web Forms
public class CustomProvider : HttpCapabilitiesEvaluator
{
public override HttpBrowserCapabilities
GetBrowserCapabilities(HttpRequest request)
{
HttpBrowserCapabilities browserCaps =
base.GetHttpBrowserCapabilities(request);
if (browserCaps.Browser == "Unknown")
{
browserCaps = MyBrowserCapabilitiesEvaulator(request);
}
return browserCaps;
}
}
Advancements in ASP.NET 4.0
Easier to use routing
PageRouteHandler class
New properties - HttpRequest.RequestContext, Page.RouteData
New expression builders -
System.Web.Compilation.RouteUrlExpressionBuilder,
System.Web.Compilation.RouteValueExpressionBuilder
RouteUrl
RouteValue
RouteParameter class
Web Forms
public class Global : System.Web.HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.MapPageRoute("SearchRoute",
"search/{searchterm}", "~/search.aspx");
RouteTable.Routes.MapPageRoute("UserRoute",
"users/{username}", "~/users.aspx");
}
}
RouteTable.Routes.Add("SearchRoute", new
Route("search/{searchterm}",
new PageRouteHandler("~/search.aspx")));
protected void Page_Load(object sender, EventArgs e)
{
string searchterm = Page.RouteData.Values["searchterm"] as
string;
label1.Text = searchterm;
}
http://localhost/search/scott
<asp:HyperLink ID="HyperLink1" runat="server"
NavigateUrl="<%$RouteUrl:SearchTerm=scott%>">Search for
Scott</asp:HyperLink>
http://localhost/search/scott
<asp:sqldatasource id="SqlDataSource1" runat="server"
connectionstring="<%$ ConnectionStrings:MyNorthwind %>"
selectcommand="SELECT CompanyName,ShipperID FROM Shippers
where
CompanyName=@companyname"
<selectparameters>
<asp:routeparameter name="companyname" RouteKey="searchterm"
/>
</selectparameters>
</asp:sqldatasource>
Advancements in ASP.NET 4.0
• Setting Client IDs (ClientIDMode property)
– AutoID (legacy)
– Static
– Predictable
– Inherit
Web Forms
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs"
Inherits="_Default"
ClientIDMode="Predictable" %>
<system.web>
<pages clientIDMode="Predictable"></pages>
</system.web>
<tc:NamingPanel runat="server" ID="ParentPanel"
ClientIDMode="Static">
<tc:NamingPanel runat="server" ID="NamingPanel1"
ClientIDMode="Predictable">
<asp:TextBox ID="TextBox1" runat="server"
Text="Hello!"></asp:TextBox>
</tc:NamingPanel>
</tc:NamingPanel>
<div id="ParentPanel">
<div id="ParentPanel_NamingPanel1">
<input
name="ctl00$ContentPlaceHolder1$ParentPanel$NamingPanel1$TextBox
1"
type="text" value="Hello!"
id="ParentPanel_NamingPanel1_TextBox1" />
</div>
Advancements in ASP.NET 4.0
ASP.NET Chart Controls
Web Forms
Advancements in ASP.NET 4.0
• QueryExtender Control
Web Forms
<asp:LinqDataSource ID="dataSource" runat="server">
TableName="Products">
</asp:LinqDataSource>
<asp:QueryExtender TargetControlID="dataSource" runat="server">
<asp:SearchExpression DataFields="ProductName,
Supplier.CompanyName"
SearchType="StartsWith">
<asp:ControlParameter ControlID="TextBoxSearch" />
</asp:SearchExpression>
</asp:QueryExtender>
<asp:LinqDataSource ID="dataSource" runat="server">
TableName="Products">
</asp:LinqDataSource>
<asp:QueryExtender TargetControlID="dataSource" runat="server">
<asp:RangeExpression DataField="UnitPrice" MinType="Inclusive"
MaxType="Inclusive">
<asp:ControlParameter ControlID="TextBoxFrom" />
<asp:ControlParameter ControlID="TexBoxTo" />
</asp:RangeExpression>
</asp:QueryExtender>
<asp:LinqDataSource ID="dataSource" runat="server"
TableName="Products">
</asp:LinqDataSource>
<asp:QueryExtender TargetControlID="dataSource" runat="server">
<asp:PropertyExpression>
<asp:ControlParameter ControlID="CheckBoxDiscontinued"
Name="Discontinued" />
</asp:PropertyExpression>
</asp:QueryExtender>
<asp:LinqDataSource ID="dataSource" runat="server"
TableName="Products">
</asp:LinqDataSource>
<asp:QueryExtender TargetControlID="dataSource" runat="server">
<asp:CustomExpression OnQuerying="FilterProducts" />
</asp:QueryExtender>
protected void FilterProducts(object sender,
CustomExpressionEventArgs e)
{
e.Query = from p in e.Query.Cast()
where p.UnitPrice >= 10
select p;
}
Advancements in ASP.NET 4.0
Enable on any ASP.NET application
Dynamic Data
<asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="True"
DataKeyNames="ProductID" DataSourceID="LinqDataSource1">
</asp:GridView>
<asp:LinqDataSource ID="LinqDataSource1" runat="server"
ContextTypeName="DataClassesDataContext" EnableDelete="True"
EnableInsert="True"
EnableUpdate="True" TableName="Products">
</asp:LinqDataSource>
GridView1.EnableDynamicData (typeof(Product));
DetailsView1.EnableDynamicData(typeof(Product), new {
ProductName = "DefaultName" });
Enhancements with ASP.NET 4.0
Web Packaging
Web.config transformation
Database deployment
One-click publish for web applications
Web App Deployment
Web.config
Debug
Release
Staging
Testing
Advancements in ASP.Net 4.0
Core Services
Extensible Request Validation
Range of allowable URLs
Object caching
Extensible HTML, URL, HTTP Header Encoding
Multi-targeting
Ajax
jQuery
CDN
ScriptManager
Web Forms
Persisting Row Selection
CSS Improvements
Rendering Improvements
Dynamic Data
Declarative syntax
Entity templates
New Field templates
Creating links
Support M:M (EF)
Web App Deployment
Web Packaging
Web.config transformations
DB deployment
One-Click Publish
Many more…
ASP.NET MVC 3.0
ASP.NET MVC 3.0
Razor View Engine
Controller improvements
Model validation improvements
Nuget integration
Partial page output caching
Scaffolding improvements
Overview
ASP.NET MVC 3.0
New view engine (Razor syntax)
Includes IntelliSense and color colorisation for Razor syntax
Can be unit tested
Includes HTML helpers
Chart, WebGrid, Crypto, WebImage, WebMail
Razor View Engine
Demo – Razor View Engine
ASP.NET MVC 3.0
Global Action Filters
Controller Improvements
public static void RegisterGlobalFilters(GlobalFilterCollection
filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new HandleLoggingAttribute());
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
ASP.NET MVC 3.0
“ViewBag” property
“ActionResult” types
HttpNotFoundResult class – HTTP 404
HttpRedirectResult class has boolean “Permanent” property – HTTP 302 or
HTTP 301
Controller Improvements
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult Test(int id)
{
return HttpNotFound();
}
ASP.NET MVC 3.0
JavaScript and Ajax improvements
Client-side validation enabled by default
Remote validator
Controller Improvements
public class User
{
[Remote("UserNameAvailable", "Users")]
public string UserName { get; set; }
}
Demo – Remote Validator
ASP.NET MVC 3.0
JSON Binding support
Controller Improvements
jQuery("#ajaxGrid").jqGrid({
url: '@Url.Action("GridData")',
datatype: "json",
jsonReader: { repeatItems: false, id: "EventId" },
colNames: ['EventId', 'EventName', 'EventDate', 'StartTime', 'EndTime',
'AllDay'],
colModel: [
{ name: 'EventId', editable: true, sortable: false, hidden: true },
{ name: 'EventName', editable: true, sortable: false, hidden: false },
{ name: 'EventDate', editable: true, sortable: false, hidden: false },
{ name: 'StartTime', editable: true, sortable: false, hidden: false },
{ name: 'EndTime', editable: true, sortable: false, hidden: false },
{ name: 'AllDay', editable: true, sortable: false, hidden: false },
],
rowNum: 3,
pager: '#ajaxGridPager',
width: '850',
height: '10.5em'
}),
ASP.NET MVC 3.0
“DataAnnotations” metadata attributes
“ValidationAttribute” Class
Validation Interfaces
IValidatableObject, IClientValidatable interfaces
Dependency Injection Improvements
Model Validation Improvements
public class User {
[Required]
public string Password { get; set; }
[Required, Compare("Password")]
public string ComparePassword { get; set; }
}
ASP.NET MVC 3.0
NuGet Integration
Partial-Page Output Caching
Scaffolding Improvements
Other new features
[OutputCache(Duration = 3600, VaryByParam = "id")]
public ViewResult Details(int id)
{
return View(personRepository.GetById(id));
}
Resources
Overview of ASP.NET 4 and VS 2010 Web Development http://www.asp.net/learn/whitepapers/aspnet4#0.2__Toc253429246
Unobstrusive JavaScript http://en.wikipedia.org/wiki/Unobtrusive_JavaScript
ASP.NET MVC 3 http://www.asp.net/mvc/mvc3#overview http://msdn.microsoft.com/en-us/library/gg416514(v=VS.98).aspx
ASP.NET MVC 3.0 Service Location (Dependency Injection) http://bradwilson.typepad.com/blog/2010/07/service-location-pt1-introduction.html
Steven Sanderson’s Blog about MVC Scaffolding http://blog.stevensanderson.com/category/scaffolding/
Alvin Lau Solutions Consultant, Datacraft MVP (ASP.NET/IIS) SGDOTNET Council Member [email protected]