9. Сравнение WebForms и MVC
WebForms MVC
o Тяжело тестировать o Легко тестировать* (SoC)
o RAD ориентация o Контроль разметки (SEO)
o Проще научится .NET o Проще научится веб-
разработчику разработчику
o Большое количество o Мало сторонних
сторонних компонентов компонентов и решений
o ViewState можно убрать o Ориентирован на
со страницы хороший дизайн
*SoC можно получить и в разработке для WebForms
11. Сравнение WebForms и MVC
o Incoming HTTP Request
o ApplicationManager
o HttpApplication
o Global.asax
o Modules (IHttpModule)
o UrlRoutingModule
o IIS 7.0
14. Сравнение WebForms и MVC
o WebFormsViewEngine работает с
ViewPage : System.Web.UI.Page
o Сохранены все принципы
o Возможна работа с MasterPage
o Можно писать обработку Page LifeCycle
во ViewPage
23. Препарируем ASP.NET : CB
o ASP.NET Framewrok строит дерево
System.Web.UI.ControlBuilder для
построения страницы
o От ControlBuilder можно наследоваться и
переопределять логику построения
26. Препарируем ASP.NET : DLR
o IronPython.dll
o IronPython.Modules.dll
o Microsoft.Scripting.dll
o Microsoft.Scripting.Core.dll
o Microsoft.Web.Scripting.dll
27. Препарируем ASP.NET : DLR
<httpModules>
<add name="DynamicLanguageHttpModule"
type="Microsoft.Web.Scripting.DynamicLanguageHttpModule"/>
</httpModules>
28. Препарируем 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]);
}
}
}
30. Препарируем ASP.NET : BP
o История о BuilderProvider от David Ebbo
http://blogs.msdn.com/davidebb/archive/2
009/06/01/a-buildprovider-to-simplify-
your-asp-net-mvc-action-links.aspx
31. Препарируем 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) %>
32. Препарируем ASP.NET : BP
<%= Html.ActionLinkToHomeIndex("Home")%>
<%= Html.ActionLinkToHomeTest("Test Link", 17,
"David")%>
<buildProviders>
<add extension=".actions«
type="MvcActionLinkHelper.MvcActionLinkBuildPro
vider" />
</buildProviders>
33. Препарируем ASP.NET : BP
<%= Html.ActionLink<HomeController>(c => c.Index(),
"Home")%>
ASP.NET MVC 2 Beta Futures
http://aspnet.codeplex.com/Release/ProjectReleases.aspx?R
eleaseId=36054
34. Препарируем ASP.NET : BP
o 200 строк кода
o Колкость работы с CodeDom
o 2 комментария HACK
o Несколько комментариев «К сожалению
нельзя…»
35. Препарируем ASP.NET : BP
o Переделано на T4
o Простота реализации и сопровождения
o Необходимость перекомпиляции при
выкладывании на сервер
38. Будущее с ASP.NET 4.0
Web.config File Minification
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation targetFramework="4.0" />
</system.web>
</configuration>
39. Будущее с ASP.NET 4.0
Extensible Output Caching
<caching>
<outputCache defaultProvider="AspNetInternalProvider">
<providers>
<add name="DiskCache"
type="Test.OutputCacheEx.DiskOutputCacheProvider,
DiskCacheProvider"/>
</providers>
</outputCache>
</caching>
40. Будущее с ASP.NET 4.0
Extensible Output Caching
<%@ OutputCache="" Duration="60"
VaryByParam="None" providerName="DiskCache" %>
41. Будущее с ASP.NET 4.0
Extensible Output Caching
public class HttpApplication : …
{
public override string GetOutputCacheProviderName(HttpContext
context)
{
if (context.Request.Path.EndsWith("Advanced.aspx"))
return "DiskCache";
else
return base.GetOutputCacheProviderName(context);
}
}
42. Будущее с ASP.NET 4.0
Auto-Start Web Applications
IIS 7.5 applicationHost.config
<applicationPools>
<add name="MyApplicationPool"
startMode="AlwaysRunning" />
</applicationPools>
44. Будущее с ASP.NET 4.0
Auto-Start Web Applications
public class CustomInitialization :
System.Web.Hosting.IProcessHostPreloadClient
{
public void Preload(string[] parameters)
{
// Perform initialization.
}
}
45. Будущее с ASP.NET 4.0
Permanently Redirecting a Page (301)
RedirectPermanent("/newpath/foroldcontent.aspx");
46. Будущее с ASP.NET 4.0
The Incredible Shrinking Session State
<sessionState
mode="SqlServer"
sqlConnectionString="data source=dbserver;Initial
Catalog=aspnetstate"
allowCustomSqlDatabase="true"
compressionEnabled="true"/>
Compression with System.IO.Compression.GZipStream
47. Будущее с ASP.NET 4.0
Expanding the Range of Allowable URLs
In previous versions 260 characters (based on NTFS)
<httpRuntime maxRequestPathLength="260"
maxQueryStringLength="2048" />
<httpRuntime requestPathInvalidChars=""<,>,*,%,&,:," />
48. Будущее с ASP.NET 4.0
Extensible Request Validation
<httpRuntime requestValidationType="Samples.MyValidator,
Samples" />
public class CustomRequestValidation : RequestValidator
{
protected override bool IsValidRequestString(
HttpContext context, string value,
RequestValidationSource requestValidationSource,
string collectionKey,
out int validationFailureIndex) {...}
}
49. Будущее с ASP.NET 4.0
Object Caching Extensibility
Большая популярность кеша из ASP.NET, его
использование в настольных и др. приложениях.
Появится новая сборка System.Runtime.Caching.dll с
абстрактными классами для реализации
собственных кешей, а так же реализация кеша в
памяти System.Runtime.Caching.MemoryCache
50. Будущее с ASP.NET 4.0
Object Caching Extensibility
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);
}
51. Будущее с ASP.NET 4.0
HTML, URL, and HTTP Header Encoding
System.Web.Util.HttpEncoder
System.Web.HttpUtility
System.Web.HttpServerUtility
<httpRuntime
encoderType="Samples.MyCustomEnco
der, Samples" />
52. Будущее с ASP.NET 4.0
Performance Monitoring for Individual
Applications in a Single Worker Process
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<runtime>
<appDomainResourceMonitoring
enabled="true"/>
</runtime>
</configuration>
53. Будущее с ASP.NET 4.0
Multi-Targeting
<compilation targetFramework="4.0"/>
1. Если не указано, то в AppPool под 4.0
2. Нужно обязательно указывать версию
при объявлении типов в web.config
3. Разные варианты скрипты
предкомпиляции
4. Будут исползоваться новые версии
55. Будущее с ASP.NET 4.0
Imperative Syntax
<script type="text/javascript">
Sys.create.watermark("#Name", { WatermarkText: "Add
name here..." });
</script>
Работает IntelliSense
56. Будущее с ASP.NET 4.0
Script Loader
• Автоматически подгружает ресурсы
• Проверяет, чтобы скрипт был загружен
единожды
• Параллельная загрузка скриптов
• Ленивая загрузка скриптов
• Работает так же со сторонними
библиотеками
57. Будущее с ASP.NET 4.0
Script Loader
<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>
58. Будущее с ASP.NET 4.0
Script Loader
o MicrosoftAjaxComponentModel.js
o MicrosoftAjaxCore.js
o MicrosoftAjaxGlobalization.js
o ACTCommon.js
o ACTExtenderBase.js
o ACTWatermark.js
59. Будущее с ASP.NET 4.0
Content Delivery Network
<script src="ajax.microsoft.com/ajax/0910/start.js"></script>
http://www.asp.net/ajaxlibrary/cdn
60. Будущее с ASP.NET 4.0
Client Data Access
o Client data controls
o Client templates
o Client data context
62. Будущее с ASP.NET 4.0
Client Data Access : DataView
<h1>Movies</h1>
<ul id="moviesView">
<li>{{Title}} - {{Director}}</li>
</ul>
63. Будущее с ASP.NET 4.0
Client Data Access : DataView
o ASP.NET (.asmx) Web services.
o WCF Web services.
o ADO.NET Data Services.
o Anything that returns JSON-formatted data.
64. Будущее с ASP.NET 4.0
Client DataContext, AdoNetDataContext
Похожи на:
o LINQ to SQL DataContext
o Entity Framework ObjectContext
Поддерживают:
o Чтение и запись
o Поддерживает сложные связи и
ассоциации
69. Будущее с ASP.NET 4.0
Browser Capabilities Providers
o Добавлены новые описания
o Переопределяемый провайдер
70. Будущее с ASP.NET 4.0
Routing
http://website/products.aspx?categoryid=12
http://website/products/software
o Базовый класс: PageRouteHandler
o Свойства: Page.RouteData
71. Будущее с ASP.NET 4.0
Routing
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");
}
72. Будущее с ASP.NET 4.0
Routing
protected void Page_Load(object sender,
EventArgs e)
{
string searchterm =
Page.RouteData.Values["searchterm"] as string;
label1.Text = searchterm;
}
73. Будущее с ASP.NET 4.0
Routing
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%>" />
74. Будущее с ASP.NET 4.0
Routing
<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>
75. Будущее с ASP.NET 4.0
ClientID
У всех control’ов (и у Page) свойство
ClientIDMode:
o AutoID – «старая» версия
o Static – «неизменяемый» ID
o Predictable – работает в паре с
ClientIDRowSuffix
o Inherit – наследуется от родителя
76. Будущее с ASP.NET 4.0
ClientID
<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?
77. Будущее с ASP.NET 4.0
Persisting Row Selection in Data Controls
<asp:GridView id="GridView2" runat="server" EnablePersistedSelection="true">
</asp:GridView>
Сохраняет выделение при пейджинге
79. Будущее с ASP.NET 4.0
QueryExtender Control : Search
<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
80. Будущее с ASP.NET 4.0
QueryExtender Control : Range
<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>
81. Будущее с ASP.NET 4.0
QueryExtender Control :
PropertyExpression
<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>
82. Будущее с ASP.NET 4.0
QueryExtender Control :
CustomExpression
<asp:LinqDataSource ID="dataSource" runat="server"
TableName="Products">
</asp:LinqDataSource>
<asp:QueryExtender TargetControlID="dataSource" runat="server">
<asp:CustomExpression OnQuerying="FilterProducts" />
</asp:QueryExtender>
83. Будущее с ASP.NET 4.0
QueryExtender Control :
CustomExpression
protected void FilterProducts(object sender, CustomExpressionEventArgs
e)
{
e.Query = from p in e.Query.Cast<Product>()
where p.UnitPrice >= 10
select p;
}
84. Будущее с ASP.NET 4.0
Html Encoded Code Expressions
<%: expression %>
<%= HttpUtility.HtmlEncode(expression) %>
<%: Request["UserInput"] %>
IHtmlString
<%: new HtmlString("<strong>HTML that is not encoded</strong>") %>
85. Будущее с ASP.NET 4.0
VS: Project Template Changes
o Empty Web Application Template
o Web Application & Web Site Project
Templates
86.
87. Ресурсы
o In depth: The ASP.NET MVC Pipeline
http://blog.codeville.net/2007/11/20/aspn
et-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
88. Ресурсы
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/as
pnet4/default.aspx