Старый новый Microsoft ASP.NET by sus16053

VIEWS: 3 PAGES: 88

									Старый новый
Microsoft ASP.NET
<%= ASP.NET.Current.Version %>
 Vitaly Baum
Senior Developer http://conteq.ru
Personal Journal http://butaji.ru
Термины
o Microsoft ASP.NET
  o MVC
  o AJAX Library
  o DynamicData
  o WebForms
Содержание доклада
o Сравнение WebForms и MVC
o Препарируем ASP.NET
o Будущее с ASP.NET 4.0
ASP.NET Framework

Сравнение WebForms и MVC
Сравнение WebForms и MVC
Сравнение WebForms и MVC




  Page LifeCycle
Page request
Start
Initialization
Load
Validation
Event handling
Rendering
Unload
Сравнение WebForms и MVC
WebForms                           MVC
o Тяжело тестировать               o Легко тестировать* (SoC)
o RAD ориентация                   o Контроль разметки (SEO)
o Проще научится .NET              o Проще научится веб-
  разработчику                       разработчику
o Большое количество               o Мало сторонних
  сторонних компонентов              компонентов и решений
o ViewState можно убрать           o Ориентирован на
  со страницы                        хороший дизайн


 *SoC можно получить и в разработке для WebForms
Сравнение WebForms и MVC

WebForms         MVC

  ASP.NET Framework

    .NET Framework
Сравнение 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 Framework

Препарируем ASP.NET
Препарируем ASP.NET
o ASP.NET Framework
  o Providers
  o Modules
  o Handlers
Препарируем 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/2
  009/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.MvcActionLinkBuildPro
vider" />
</buildProviders>
Препарируем 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
Препарируем ASP.NET : BP
o 200 строк кода
o Колкость работы с CodeDom
o 2 комментария HACK
o Несколько комментариев «К сожалению
  нельзя…»
Препарируем ASP.NET : BP
o Переделано на T4
o Простота реализации и сопровождения
o Необходимость перекомпиляции при
  выкладывании на сервер
ASP.NET Framework

Будущее с ASP.NET 4.0
ASP.NET Framework

Core Services
Будущее с ASP.NET 4.0
Web.config File Minification
<?xml version="1.0"?>
<configuration>
 <system.web>
  <compilation targetFramework="4.0" />
 </system.web>
</configuration>
Будущее с ASP.NET 4.0
Extensible Output Caching
<caching>
 <outputCache defaultProvider="AspNetInternalProvider">
  <providers>
    <add name="DiskCache"
    type="Test.OutputCacheEx.DiskOutputCacheProvider,
DiskCacheProvider"/>
  </providers>
 </outputCache>
</caching>
Будущее с ASP.NET 4.0
Extensible Output Caching
<%@ OutputCache="" Duration="60"
    VaryByParam="None" providerName="DiskCache" %>
Будущее с 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);
    }
}
Будущее с ASP.NET 4.0
Auto-Start Web Applications
IIS 7.5 applicationHost.config
<applicationPools>
  <add name="MyApplicationPool"
startMode="AlwaysRunning" />
</applicationPools>
Будущее с ASP.NET 4.0
Auto-Start Web Applications
<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>
Будущее с ASP.NET 4.0
Auto-Start Web Applications
 public class CustomInitialization :
System.Web.Hosting.IProcessHostPreloadClient
 {
   public void Preload(string[] parameters)
   {
     // Perform initialization.
   }
 }
Будущее с ASP.NET 4.0
Permanently Redirecting a Page (301)
RedirectPermanent("/newpath/foroldcontent.aspx");
Будущее с 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
Будущее с 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=""<,>,*,%,&,:,\" />
Будущее с 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) {...}
}
Будущее с ASP.NET 4.0
Object Caching Extensibility
Большая популярность кеша из ASP.NET, его
использование в настольных и др. приложениях.

Появится новая сборка System.Runtime.Caching.dll с
абстрактными классами для реализации
собственных кешей, а так же реализация кеша в
памяти System.Runtime.Caching.MemoryCache
Будущее с 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);
  }
Будущее с 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" />
Будущее с 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>
Будущее с ASP.NET 4.0
Multi-Targeting
<compilation targetFramework="4.0"/>
1. Если не указано, то в AppPool под 4.0
2. Нужно обязательно указывать версию
   при объявлении типов в web.config
3. Разные варианты скрипты
   предкомпиляции
4. Будут исползоваться новые версии
ASP.NET Framework

Microsoft AJAX Library
Будущее с ASP.NET 4.0
Imperative Syntax
<script type="text/javascript">
 Sys.create.watermark("#Name", { WatermarkText: "Add
name here..." });
</script>


Работает IntelliSense
Будущее с ASP.NET 4.0
Script Loader
• Автоматически подгружает ресурсы
• Проверяет, чтобы скрипт был загружен
  единожды
• Параллельная загрузка скриптов
• Ленивая загрузка скриптов
• Работает так же со сторонними
  библиотеками
Будущее с 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>
Будущее с ASP.NET 4.0
Script Loader
o MicrosoftAjaxComponentModel.js
o MicrosoftAjaxCore.js
o MicrosoftAjaxGlobalization.js
o ACTCommon.js
o ACTExtenderBase.js
o ACTWatermark.js
Будущее с ASP.NET 4.0
Content Delivery Network
<script src="ajax.microsoft.com/ajax/0910/start.js"></script>




http://www.asp.net/ajaxlibrary/cdn
Будущее с ASP.NET 4.0
Client Data Access
o Client data controls
o Client templates
o Client data context
Будущее с ASP.NET 4.0
Client Data Access : DataView
<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>
Будущее с ASP.NET 4.0
Client Data Access : DataView
<h1>Movies</h1>
<ul id="moviesView">
     <li>{{Title}} - {{Director}}</li>
</ul>
Будущее с 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.
Будущее с ASP.NET 4.0
Client DataContext, AdoNetDataContext
Похожи на:
o LINQ to SQL DataContext
o Entity Framework ObjectContext
Поддерживают:
o Чтение и запись
o Поддерживает сложные связи и
  ассоциации
Будущее с ASP.NET 4.0
jQuery Integration
<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>
ASP.NET Framework

WebForms
Будущее с ASP.NET 4.0
MetaTags
<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" %>
Будущее с ASP.NET 4.0
ViewStateMode
<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
Будущее с ASP.NET 4.0
Browser Capabilities Providers
o Добавлены новые описания
o Переопределяемый провайдер
Будущее с ASP.NET 4.0
Routing
http://website/products.aspx?categoryid=12
http://website/products/software
o Базовый класс: PageRouteHandler
o Свойства: Page.RouteData
Будущее с 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");
  }
Будущее с ASP.NET 4.0
Routing
protected void Page_Load(object sender,
EventArgs e)
{
  string searchterm =
Page.RouteData.Values["searchterm"] as string;
  label1.Text = searchterm;
}
Будущее с 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%>" />
Будущее с 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>
Будущее с ASP.NET 4.0
ClientID
У всех control’ов (и у Page) свойство
ClientIDMode:
o AutoID – «старая» версия
o Static – «неизменяемый» ID
o Predictable – работает в паре с
  ClientIDRowSuffix
o Inherit – наследуется от родителя
Будущее с 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?
Будущее с ASP.NET 4.0
Persisting Row Selection in Data Controls

<asp:GridView id="GridView2" runat="server" EnablePersistedSelection="true">
</asp:GridView>



Сохраняет выделение при пейджинге
Будущее с ASP.NET 4.0
ASP.NET Chart Control
Будущее с 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
Будущее с 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>
Будущее с 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>
Будущее с 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>
Будущее с 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;
}
Будущее с ASP.NET 4.0
Html Encoded Code Expressions
<%: expression %>
<%= HttpUtility.HtmlEncode(expression) %>
<%: Request["UserInput"] %>


IHtmlString
<%: new HtmlString("<strong>HTML that is not encoded</strong>") %>
Будущее с ASP.NET 4.0
VS: Project Template Changes
o Empty Web Application Template
o Web Application & Web Site Project
  Templates
Ресурсы
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
Ресурсы
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

								
To top