the old new asp.net
DESCRIPTION
This slides from ALT.NET meeting about ASP.NET at Saint-Petersburg 03/12/09TRANSCRIPT
Старый новый Microsoft ASP.NET <%= ASP.NET.Current.Version %>
Senior Developer http://conteq.ru
Personal Journal http://butaji.ru
Vitaly Baum
Термины
o Microsoft ASP.NET
oMVC
o AJAX Library
oDynamicData
oWebForms
Содержание доклада
o Сравнение WebForms и MVC
o Препарируем ASP.NET
o Будущее с ASP.NET 4.0
Сравнение WebForms и MVC
ASP.NET Framework
Сравнение WebForms и MVC
Сравнение WebForms и MVC
Page LifeCycle
Page request Start Initialization Load Validation Event handling Rendering Unload
Сравнение WebForms и MVC
WebForms
o Тяжело тестировать
o RAD ориентация
o Проще научится .NET разработчику
o Большое количество сторонних компонентов
o ViewState можно убрать со страницы
MVC
o Легко тестировать* (SoC)
o Контроль разметки (SEO)
o Проще научится веб-разработчику
o Мало сторонних компонентов и решений
o Ориентирован на хороший дизайн
*SoC можно получить и в разработке для WebForms
Сравнение WebForms и MVC
.NET Framework
ASP.NET Framework
WebForms MVC
Сравнение WebForms и MVC
o Incoming HTTP Request
o ApplicationManager
o HttpApplication
o Global.asax
o Modules (IHttpModule)
o UrlRoutingModule
o IIS 7.0
Сравнение WebForms и MVC
Сравнение WebForms и MVC
public interface IViewEngine { // Methods ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache); ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache); void ReleaseView(ControllerContext controllerContext, IView view); }
Сравнение WebForms и MVC
o WebFormsViewEngine работает с ViewPage : System.Web.UI.Page
o Сохранены все принципы
o Возможна работа с MasterPage
o Можно писать обработку Page LifeCycle во ViewPage
Сравнение WebForms и MVC
Framework Solutions Platform
Сравнение WebForms и MVC
Framework Solutions Platform
Сравнение WebForms и MVC
Framework Solutions Platform
Сравнение WebForms и MVC
Framework Solutions Platform
Препарируем ASP.NET
ASP.NET Framework
Препарируем ASP.NET
o ASP.NET Framework
o Providers
oModules
oHandlers
Препарируем ASP.NET
o MVC Framework
o ViewEngines
o ControllerFactories
o Filters
o Routing
Препарируем ASP.NET
o Dynamic Language Support
o ControlBuilder
o BuildProvider
Препарируем ASP.NET : CB
o ASP.NET Framewrok строит дерево System.Web.UI.ControlBuilder для построения страницы
o От ControlBuilder можно наследоваться и переопределять логику построения
Препарируем ASP.NET : CB
o Constructor Injection в UserControl
Препарируем ASP.NET : DLR
o ASP.NET on IronPython
Препарируем ASP.NET : DLR
o IronPython.dll
o IronPython.Modules.dll
o Microsoft.Scripting.dll
o Microsoft.Scripting.Core.dll
o Microsoft.Web.Scripting.dll
Препарируем ASP.NET : DLR
<httpModules> <add name="DynamicLanguageHttpModule" type="Microsoft.Web.Scripting.DynamicLanguageHttpModule"/> </httpModules>
Препарируем ASP.NET : DLR
Internal class DynamicLanguageHttpModule : IHttpModule, IBuildProvider { private class GlobalAsaxBuildResult : TypeWithEventsBuildResult {
private void CallFunction(ScriptEngine engine, DynamicFunction f) { f.Invoke(engine, new object[0]); }
} }
Препарируем ASP.NET : DLR
<microsoft.scripting debugMode="true"> <languages> <language names="IronPython;Python;py" extensions=".py" displayName="IronPython 2.0 Beta" type="IronPython.Runtime.PythonContext, IronPython, Version=2.0.0.5000, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </languages> </microsoft.scripting>
Препарируем ASP.NET : BP
o История о BuilderProvider от David Ebbo http://blogs.msdn.com/davidebb/archive/2009/06/01/a-buildprovider-to-simplify-your-asp-net-mvc-action-links.aspx
Препарируем ASP.NET : BP
<%= Html.ActionLink("Home", "Index", "Home")%>
public ActionResult Test(int id, string name)
{
return View();
}
<%= Html.ActionLink("Test Link", "Test", "Home",
new { id = 17, name = "David" }, null) %>
Препарируем ASP.NET : BP
<%= Html.ActionLinkToHomeIndex("Home")%>
<%= Html.ActionLinkToHomeTest("Test Link", 17, "David")%>
<buildProviders>
<add extension=".actions« type="MvcActionLinkHelper.MvcActionLinkBuildProvider" />
</buildProviders>
Препарируем ASP.NET : BP
<%= Html.ActionLink<HomeController>(c => c.Index(), "Home")%>
ASP.NET MVC 2 Beta Futures
http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=36054
Препарируем ASP.NET : BP
o 200 строк кода
o Колкость работы с CodeDom
o 2 комментария HACK
o Несколько комментариев «К сожалению нельзя…»
Препарируем ASP.NET : BP
o Переделано на T4
o Простота реализации и сопровождения
o Необходимость перекомпиляции при выкладывании на сервер
Будущее с ASP.NET 4.0
ASP.NET Framework
Core Services
ASP.NET Framework
Будущее с ASP.NET 4.0
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation targetFramework="4.0" />
</system.web>
</configuration>
Web.config File Minification
Будущее с ASP.NET 4.0
<caching>
<outputCache defaultProvider="AspNetInternalProvider">
<providers>
<add name="DiskCache"
type="Test.OutputCacheEx.DiskOutputCacheProvider, DiskCacheProvider"/>
</providers>
</outputCache>
</caching>
Extensible Output Caching
Будущее с ASP.NET 4.0
<%@ OutputCache="" Duration="60" VaryByParam="None" providerName="DiskCache" %>
Extensible Output Caching
Будущее с ASP.NET 4.0
public class HttpApplication : …
{ public override string GetOutputCacheProviderName(HttpContext context)
{
if (context.Request.Path.EndsWith("Advanced.aspx"))
return "DiskCache";
else
return base.GetOutputCacheProviderName(context);
}
}
Extensible Output Caching
Будущее с ASP.NET 4.0
IIS 7.5 applicationHost.config
<applicationPools>
<add name="MyApplicationPool" startMode="AlwaysRunning" />
</applicationPools>
Auto-Start Web Applications
Будущее с ASP.NET 4.0
<sites> <site name="MySite" id="1"> <application path="/" serviceAutoStartEnabled="true" serviceAutoStartProvider="PrewarmMyCache" > <!-- Additional content --> </application> </site> </sites> <serviceAutoStartProviders> <add name="PrewarmMyCache" type="MyNamespace.CustomInitialization, MyLibrary" /> </serviceAutoStartProviders>
Auto-Start Web Applications
Будущее с ASP.NET 4.0
public class CustomInitialization : System.Web.Hosting.IProcessHostPreloadClient
{
public void Preload(string[] parameters)
{
// Perform initialization.
}
}
Auto-Start Web Applications
Будущее с ASP.NET 4.0
RedirectPermanent("/newpath/foroldcontent.aspx");
Permanently Redirecting a Page (301)
Будущее с ASP.NET 4.0
<sessionState
mode="SqlServer"
sqlConnectionString="data source=dbserver;Initial Catalog=aspnetstate"
allowCustomSqlDatabase="true"
compressionEnabled="true"/>
Compression with System.IO.Compression.GZipStream
The Incredible Shrinking Session State
Будущее с ASP.NET 4.0
In previous versions 260 characters (based on NTFS)
<httpRuntime maxRequestPathLength="260" maxQueryStringLength="2048" />
<httpRuntime requestPathInvalidChars=""<,>,*,%,&,:,\" />
Expanding the Range of Allowable URLs
Будущее с ASP.NET 4.0
<httpRuntime requestValidationType="Samples.MyValidator, Samples" /> public class CustomRequestValidation : RequestValidator { protected override bool IsValidRequestString( HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex) {...} }
Extensible Request Validation
Будущее с ASP.NET 4.0
Большая популярность кеша из ASP.NET, его использование в настольных и др. приложениях.
Появится новая сборка System.Runtime.Caching.dll с абстрактными классами для реализации собственных кешей, а так же реализация кеша в памяти System.Runtime.Caching.MemoryCache
Object Caching Extensibility
Будущее с ASP.NET 4.0
private void btnGet_Click(object sender, EventArgs e) { ObjectCache cache = MemoryCache.Default; fileContents = cache["filecontents"] as string; if (fileContents == null) { CacheItemPolicy policy = new CacheItemPolicy(); List<string> filePaths = new List<string>(); filePaths.Add("c:\\data.txt"); policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths)); fileContents = File.ReadAllText("c:\\data.txt"); cache.Set("filecontents", fileContents, policy); } MessageBox.Show(fileContents); }
Object Caching Extensibility
Будущее с ASP.NET 4.0
System.Web.Util.HttpEncoder
System.Web.HttpUtility
System.Web.HttpServerUtility
<httpRuntime encoderType="Samples.MyCustomEncoder, Samples" />
HTML, URL, and HTTP Header Encoding
Будущее с ASP.NET 4.0
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<runtime>
<appDomainResourceMonitoring enabled="true"/>
</runtime>
</configuration>
Performance Monitoring for Individual Applications in a Single Worker Process
Будущее с ASP.NET 4.0
<compilation targetFramework="4.0"/>
1. Если не указано, то в AppPool под 4.0
2. Нужно обязательно указывать версию при объявлении типов в web.config
3. Разные варианты скрипты предкомпиляции
4. Будут исползоваться новые версии
Multi-Targeting
Microsoft AJAX Library
ASP.NET Framework
Будущее с ASP.NET 4.0
<script type="text/javascript">
Sys.create.watermark("#Name", { WatermarkText: "Add name here..." });
</script>
Работает IntelliSense
Imperative Syntax
Будущее с ASP.NET 4.0
• Автоматически подгружает ресурсы
• Проверяет, чтобы скрипт был загружен единожды
• Параллельная загрузка скриптов
• Ленивая загрузка скриптов
• Работает так же со сторонними библиотеками
Script Loader
Будущее с ASP.NET 4.0
<script src="../Scripts/MicrosoftAjax/start.js" type="text/javascript"></script> <script src="../Scripts/ACT/ACTRegisterExtended.js" type="text/javascript"></script> <script type="text/javascript"> Sys.require(Sys.components.watermark, function() { Sys.create.watermark("#Name", { WatermarkText: "Add name here..." }); }); </script>
Script Loader
Будущее с ASP.NET 4.0
o MicrosoftAjaxComponentModel.js
o MicrosoftAjaxCore.js
o MicrosoftAjaxGlobalization.js
o ACTCommon.js
o ACTExtenderBase.js
o ACTWatermark.js
Script Loader
Будущее с ASP.NET 4.0
<script src="ajax.microsoft.com/ajax/0910/start.js"></script>
http://www.asp.net/ajaxlibrary/cdn
Content Delivery Network
Будущее с ASP.NET 4.0
o Client data controls
o Client templates
o Client data context
Client Data Access
Будущее с ASP.NET 4.0
<script src="Scripts/MicrosoftAjax/start.js" type="text/javascript"></script> <script type="text/javascript"> Sys.require([Sys.components.dataView, Sys.components.dataContext], function() { Sys.create.dataView("#moviesView", { dataProvider: "Services/MovieService.svc", fetchOperation: "GetMovies", autoFetch: true } ); }); </script>
Client Data Access : DataView
Будущее с ASP.NET 4.0
<h1>Movies</h1>
<ul id="moviesView">
<li>{{Title}} - {{Director}}</li>
</ul>
Client Data Access : DataView
Будущее с ASP.NET 4.0
o ASP.NET (.asmx) Web services.
o WCF Web services.
o ADO.NET Data Services.
o Anything that returns JSON-formatted data.
Client Data Access : DataView
Будущее с ASP.NET 4.0
Похожи на:
o LINQ to SQL DataContext
o Entity Framework ObjectContext
Поддерживают:
o Чтение и запись
o Поддерживает сложные связи и ассоциации
Client DataContext, AdoNetDataContext
Будущее с ASP.NET 4.0
<script src="Scripts/MicrosoftAjax/start.js" type="text/javascript"></script>
<script src="Scripts/ACT/ACTRegisterExtended.js" type="text/javascript"></script>
<script type="text/javascript">
Sys.require([Sys.components.watermark, Sys.scripts.jQuery], function() {
$(".required")
.watermark({
WatermarkText: "Add something here..."
})
.css({
backgroundColor: "red",
color: "white"
});
});
</script>
jQuery Integration
WebForms
ASP.NET Framework
Будущее с ASP.NET 4.0
<head id="Head1" runat="server">
<title>Untitled Page</title>
<meta name="keywords" content="These, are, my, keywords" />
<meta name="description" content="This is the description of my page" />
</head>
Page.MetaKeywords, Page.MetaDescription
<%@ Page Language="C#" Keywords="These, are, my, keywords"
Description="This is a description" %>
MetaTags
Будущее с ASP.NET 4.0
<asp:PlaceHolder ID="PlaceHolder1" runat="server" ViewStateMode="Disabled">
Disabled: <asp:Label ID="label1" runat="server" Text="[DeclaredValue]" /><br />
<asp:PlaceHolder ID="PlaceHolder2" runat="server" ViewStateMode="Enabled">
Enabled: <asp:Label ID="label2" runat="server" Text="[DeclaredValue]" />
</asp:PlaceHolder>
</asp:PlaceHolder>
Разница с EnableViewState
ViewStateMode
Будущее с ASP.NET 4.0
o Добавлены новые описания
o Переопределяемый провайдер
Browser Capabilities Providers
Будущее с ASP.NET 4.0
http://website/products.aspx?categoryid=12
http://website/products/software
o Базовый класс: PageRouteHandler
o Свойства: Page.RouteData
Routing
Будущее с ASP.NET 4.0
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"); }
Routing
Будущее с ASP.NET 4.0
protected void Page_Load(object sender, EventArgs e)
{
string searchterm = Page.RouteData.Values["searchterm"] as string;
label1.Text = searchterm;
}
Routing
Будущее с ASP.NET 4.0
Expression Builders: RouteUrl, RouteValue
<asp:HyperLink ID="HyperLink1" runat="server"
NavigateUrl="<%$RouteUrl:SearchTerm=scott%>">Search for Scott</asp:HyperLink>
<asp:Label ID="Label1" runat="server" Text="<%$RouteValue:SearchTerm%>" />
Routing
Будущее с ASP.NET 4.0
<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>
Routing
Будущее с ASP.NET 4.0
У всех control’ов (и у Page) свойство ClientIDMode:
o AutoID – «старая» версия
o Static – «неизменяемый» ID
o Predictable – работает в паре с ClientIDRowSuffix
o Inherit – наследуется от родителя
ClientID
Будущее с ASP.NET 4.0
<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$TextBox1"
type="text" value="Hello!" id="ParentPanel_NamingPanel1_TextBox1" />
</div>
* Вопрос: для чего используется id, а для чего name?
ClientID
Будущее с ASP.NET 4.0
<asp:GridView id="GridView2" runat="server" EnablePersistedSelection="true">
</asp:GridView>
Сохраняет выделение при пейджинге
Persisting Row Selection in Data Controls
Будущее с ASP.NET 4.0
ASP.NET Chart Control
Будущее с ASP.NET 4.0
<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>
LinqDataSource
EntityDataSource
QueryExtender Control : Search
Будущее с ASP.NET 4.0
<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>
QueryExtender Control : Range
Будущее с ASP.NET 4.0
<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>
QueryExtender Control : PropertyExpression
Будущее с ASP.NET 4.0
<asp:LinqDataSource ID="dataSource" runat="server" TableName="Products">
</asp:LinqDataSource>
<asp:QueryExtender TargetControlID="dataSource" runat="server">
<asp:CustomExpression OnQuerying="FilterProducts" />
</asp:QueryExtender>
QueryExtender Control : CustomExpression
Будущее с ASP.NET 4.0
protected void FilterProducts(object sender, CustomExpressionEventArgs e)
{
e.Query = from p in e.Query.Cast<Product>()
where p.UnitPrice >= 10
select p;
}
QueryExtender Control : CustomExpression
Будущее с ASP.NET 4.0
<%: expression %>
<%= HttpUtility.HtmlEncode(expression) %>
<%: Request["UserInput"] %>
IHtmlString
<%: new HtmlString("<strong>HTML that is not encoded</strong>") %>
Html Encoded Code Expressions
Будущее с ASP.NET 4.0
o Empty Web Application Template
o Web Application & Web Site Project Templates
VS: Project Template Changes
Ресурсы
o In depth: The ASP.NET MVC Pipeline http://blog.codeville.net/2007/11/20/aspnet-mvc-pipeline-lifecycle/
o Comparing Web Forms And ASP.NET MVC http://msdn.microsoft.com/en-us/magazine/dd942833.aspx
o ASP.NET Application Life Cycle Overview for IIS 7.0 http://msdn.microsoft.com/en-us/library/bb470252(VS.100).aspx
Ресурсы
o ASP.NET on CodePlex http://aspnet.codeplex.com/
o ASP.NET 4 and Visual Studio 2010 Web Development Beta 2 Overview http://www.asp.net/LEARN/whitepapers/aspnet4/default.aspx