Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

Jaký pohled si vybrat?

18.07 - 10. ledna 2009 | Webdesign

ASP.NET MVC je velice modulární, jeho největší devízou je, že skoro vše lze nahradit něčím jiným. Nejinak je tomu i u ViewEnginu (šablonovací systém). Dokonce můžete v jedné aplikaci používat několik šablonovacích systémů vedle sebe. A to už se vyplatí!

Jaký je výběr?

Existuje spousta známých i neznámých šablonovacích systémů. Najznámější jsou asi, počkejte si na to, PHP/ASP. Ha! Ano, PHPASP nejsou nic jinýho než šablonovací systémy. To že v nich někdo dokáže psát celé aplikace – klobouk dolu.

Šablonovací systém najdete téměř v každém oblíbeném webovém frameworku. V ASP.NET MVC mu většinou říkáme ASPX nebo WebForms view engine. To je ten, který se používá v základu. Narozdíl od ASP můžete v ASPX šablonách používat i serverové značky. Toho lze využít pro tvorbu Master pages a Content pages, nebo pro snadnou lokalizaci za pomocí asp:Localize. :) V takové šabloně můžete navíc použít jakýkoli dotnetí jazyk pro logiku pohledu. Následuje ukázka pohledu s jazykem C#:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Test view page</title>
</head>
<body>
  <h1>Test view page</h1>

  <ul>
    <% foreach (var company in Model.Companies) { %>
    <li><%= company.Name %></li>
    <% } %>
  </ul>

  <% using(Html.BeginForm("create", "company", FormMethod.Post) { %>
   <fieldset>
     <legend>Create new company</legend>
     <label for="companyName">Name:</label>
     <%= Html.TextBox("companyName") %>
     <input type="submit" value="Create company" />
   </fieldset>
  <% } %>
</body>
</html>

Stejná ukázka za použití Visual Basicu:

<%@ Page Language="VB"  Inherits="System.Web.Mvc.ViewPage" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Test view page</title>
</head>
<body>
  <h1>Test view page</h1>

  <ul>
    <% For Each company In Model.Companies %>
    <li><%= company.Name %></li>
    <% Next %>
  </ul>

  <% Using Html.BeginForm("create", "company", FormMethod.Post) %>
   <fieldset>
     <legend>Create new company</legend>
     <label for="companyName">Name:</label>
     <%= Html.TextBox("companyName") %>
     <input type="submit" value="Create company" />
   </fieldset>
  <% End Using %>
</body>
</html>

Osobně v pohledech upřednostňuju Visual Basic – je to díky jeho ukecanosti. Ano, i ta se někdy může hodit. V pohledech je pak lépe vidět, kde začíná a končí for cyklus nebo podmíněný blok. Nejspíš lze stejného efektu dosáhnout i za použití IronRuby. Ale to zjistím asi velice brzy. :)

Když už jsme u toho Ruby, potažmo u Railsů, nesmím zapomenout zmínit Haml. Kód v něm může vypadat celkem obskurně, ale má přísnou logiku a zachovává čistou strukturu pohledu.

%html{:xmlns => 'http://www.w3.org/1999/xhtml'}
  %head
    %title Test view page
  %body
    %h1 Test view page
    %ul
      -model.companies.each do |company|
        %li= company.name
    %form{:action => url.action({:action => 'Create'}), :method => 'post'}
      %fieldset
        %legend Create new company
        %label{:for => 'companyName'} Name:
        =html.text_box('companyName')
        %input{:type => 'submit', :value => 'Create company'}

Do ASP.NET MVC lze přidat jeho port do dotnetu: NHaml. Pro logiku pohledu lze použít jazyky C#, IronRuby a Boo.

Obecným šablonovacím jazykem je Velocity, které si našlo cestu například do MonoRailu v podobě NVelocity. Samozřejmě je ho možné používat i v ASP.NET MVC.

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Test view page</title>
</head>
<body>
  <h1>Test view page</h1>

  <ul>
#foreach($company in $model.Companies)
    <li>$company.Name</li>
#end
  </ul>

  <form action="$url.Action('create')" method="POST">
    <fieldset>
      <legend>Create new company</legend>
      <label for="companyName">Name:</label>
      $html.TextBox('companyName')
      <input type="submit" value="Create company" />
    </fieldset>
  </form>
</body>
</html>

Na půdě MonoRailu vznikl i další šablonovací systém postavený nad Boo s poetickým názvem Brail. V šablonách se může používat i rozšířená syntaxe Boo, která není závislá na odsazování a používá end literály pro definici bloků.

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Test view page</title>
</head>
<body>
  <h1>Test view page</h1>

  <ul>
    <?brail for company in model.Companies: ?>
    <li>${company.Name}</li>
    <?brail end ?>
  </ul>

  <?brail using Html.BeginForm('create', 'company', FormMethod.Post): ?>
    <fieldset>
      <legend>Create new company</legend>
      <label for="companyName">Name:</label>
      ${Html.TextBox('companyName')}
      <input type="submit" value="Create company" />
    </fieldset>
  <?brail end ?>
</body>
</html>

Samozřejmě můžete místo <?brail ?> použít zkrácený zápis <% %>, to už je jen na vás, jestli se vám víc líbí PHP nebo ASP styl…

A pomalu se blížíme k poslednímu zajímavému šablonovacímu systému. A tím je Spark. Spark si klade za cíl, být co nejblíže kodérovi a jeho syntaxe je založená primárně na XHTML. Pro logiku pohledu využíváte rozšířených značek a atributů, které jsou překládány do vámi zvoleného jazyka. Zvolit si můžete tradičně mezi C#, IronRuby a IronPython.

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Test view page</title>
</head>
<body>
  <h1>Test view page</h1>

  <ul>
    <li each="company in model.Companies">${company.name}</li>
  </ul>

  <form action="${url.action('create')}" method="POST">
    <fieldset>
      <legend>Create new company</legend>
      <label for="companyName">Name:</label>
      ${html.text_box('companyName')}
      <input type="submit" value="Create company" />
    </fieldset>
  </form>
</body>
</html>

Závěr

Když se podíváte na výše uvedené ukázky, zjistíte, že mají mnohé společné. Na vás je si vybrat. Každý z šablonovacích systémů má svá specifika a například Sparku bych se chtěl podrobněji věnovat v některém z následujících spo­tů.

Pokud se rozhodnete některý z view enginů použít, zkuste to přes projekt MVC Contrib.

Díky možnostem otevřené architektury ASP.NET MVC a možnosti zvolit si k práci jazyk, který vám nejvíce vyhovuje, můžete docílit nejen úspěchu u žen, ale i dle vašich preferencí! No řekněte, kdo z vás to má?

V ukázkách NHamlu a Sparku jsem zvolil integraci s jazykem IronRuby.

Autor: Aleš Roubíček | 9x komentováno | Delicious | FriendFeed | Facebook | Linkuj!

Jak funguje MonoRail

13.20 - 17. srpna 2007 | ASP.NET 2.0

Po letmém seznámení s frameworkem MonoRail (MR) je tu první část slibovaného seriálu. V dnešním díle se ponoříme do technických principů frameworku.

Základem MR je klasický IHttpHandler známý z ASP.NET, který se stará o zpracování požadavků přicházejících na server. Ve výchozím stavu zpracovává požadavky s příponou .rails, ale protože tato není na většině hostingů nastavena na ISAPI filtr ASP.NET, dá se nastavit zpracování přípony jiné (často ashx), která je webovému serveru známá a je spojená s ASP.NET filtrem.

Handler rozparsuje adresu a snaží se najít vhodný Controller a jeho metodu, která požadavek zpracuje a předá data na patřičný View. Vypadá to asi následovně. Na handler přijde požadavek ve tvaru /home/index.rails, handler se pokusí vyhledat třídu HomeController, která dědí ze třídy Controller, a u ní metodu Index(). Takže controller pro tento požadavek by vypadal asi následovně:

public class HomeControler : Controller {
  public void Index()  {
    PropertyBag["hello"] = "Pozdrav z jednokolejky";
  }
}

Takový controller by se měl nacházet v projektu ve složce controllers. Vlastnost PropertyBag je slovník (asociativní pole), který předává data z controlleru na view. Aby se nám to celé mohlo někde zobrazit, potřebujeme ještě tedy view. Ve složce /views/home/ si vytvoříme soubor index.brail (Brail je jedním z ViewEnginů) do kterého zadáme:

<html>
  <head>
    <title>Pozdrav</title>
  </head>
  <body>
    <h1>${hello}</h1>
  </body>
</html>

Řetězec ${hello} bude na výstupu nahrazen textem z PropertyBagu. Dolar složené závorky totiž prochází lokální proměnné a snaží se z nich získat hodnotu. Pokud taková proměnná neexistuje zavolá se metoda GetParametr, která projde kolekce PropertyBag, Flash, Request apod. a snaží se v nich nalézt klíč, kterým je text mezi závorkami. Hodnota je pak vypsána namísto dolarové funkce. :) Dolarová funkce je takový shortcut pro tento zápis: <?brail output hello ?> což je obdoba <?php echo $hello; ?> v PHP nebo <%= hello %> v ASP.

Celá skládačka do sebe zapadne, když do prohlížeče zadáme adresu http://server/home/index.rails. Díky příponě rails se požadavek předá Handleru MonoRail. Ten rozparsuje adresu a snaží se najít třídu HomeController, kterou jsme vytvořili, takže success. V této třídě hledá metodu Index, tu máme taky, další bod k dobru. Tato metoda nám nastaví v PropertyBagu hello na hodnotu „Pozdrav z jednokolejky“. Dále handler hledá vhodné view, které jsme také vytvořili. Předá mu Context, zpracuje se šablona a nakonec bude do prohlížeče odesláno HTML.

<html>
  <head>
    <title>Pozdrav</title>
  </head>
  <body>
    <h1>Pozdrav z jednokolejky</h1>
  </body>
</html>

Pro dnešek vše.

Související

Autor: Aleš Roubíček | 4x komentováno | Delicious | FriendFeed | Facebook | Linkuj!

Začínáme s jednokolejkou

16.10 - 14. srpna 2007 | ASP.NET 2.0

Jedním z fenoménů poslední doby ve webovém vývoji jsou bezesporu Ruby on Rails (RoR). Framework určený k RAD Agile vývoji používající objektový přístup a postavený na návrhových vzorech jako je MVC nebo Active Record. Framework je určený pro jazyk či platformu Ruby, to je jeho výhoda i omezení zároveň. Málokdo se má chuť nebo čas se po nocích učit novým jazykům a stávat se vícenásobným robotem.

RoR není rozhodně jediným projektem s podobnou filosofií. My dotneťáci máme krom WebForms, které se snaží přihnout webový vývoj desktopovým zvyklostem (událostmi řízený, stavový), podobný framework, který je navíc opensource. Tento framework se jmenuje MonoRail a oněm bude následující článek a možná i mini seriálek :)

MonoRail

Z názvu by se mohlo zdát, že má projekt něco společného s Monem, opensource implementací dotnetu, ale není tomu tak, krom toho, že MonoRail běží i na Monu 1.1. MonoRail je součást opensource projeku Castle, který si klade za cíl RAD v Enterprise prostředí. Jeho součástí jsou frameworky ActiveRecord (ORM Persistence layer postavený nad NHibernate), Windsor container (Inversion of Control), DynamicProxy (vytváří Proxy třídy z Interfejsů) a právě MonoRail. Všechny frameworky umějí pracovat samostatně, ale jejich největší síla je v jejich spolupráci.

Co je tedy MonoRail? Je to MVC framework inspirovaný ActionPackem běžící na platformně dotnet. Je to náhrada ASP.NET WebForms, ale ty mohou sloužit jako ViewEngine, nebo běžet v jedné aplikaci s MonoRails vedle sebe. Dalšími ViewEnginy jsou NVelocity (port Velocity pod dotnet) nebo Brail (Views jsou psaná v jazyce Boo, což je skriptovací Python like jazyk pro dotnet). Preferovanější je asi NVelocity, ale vývoj Brailu je živější, a WebForms se pro změnu skoro nepoužívají (kvůli PageLife cyklu, který v MonoRailu neexistuje). MonoRail se vám může oproti ASP.NET zdát oldskůlovější, ale opak je pravdou. MonoRail přináší zjednodušení, vrací se k webovému vývoji (bezestavový, Request/Response), staví na osvědčených metodách a zrychluje celý vývoj. Konec řečí, pojďme na věc :)

Model

Model obecně slouží jako zdroj/zpracovávač dat aplikace. Podle toho, jak je vaše aplikace složitá, je bohatý váš model :). Zpravidla se jedná o Domain Model, Business logiku, nebo cokoli jiného, co má na starosti ověřování obchodních pravidel, persistenci a získávání dat. Pro jednoduchost stačí vygenerovat Entity podle DB schématu pomocí ActiveRecord Generatoru nebo naopak vytvořit model a z něj vygenerovat schema.

[ActiveRecord]
public class User : ActiveRecordBase {
  [PrimaryKey] public int Id { get; set; }
  [Property] public string Name { get; set; }
  ...
}

Pro zjednodušení napsáno v C# 3.0 :) ActiveRecord plně využívá atributů k popisu schematu. Dědění třídy ActiveRecordBase není nutností, pro začátek stačí vědět, že nám přidává k entitě spoustu metod pro databázový přístup. Vhodnější pravděpodobně bude využít interface IRepository<T> z projektu Rhino.Commons, který využívá Repository pattern.

View

View jsou obvykle soubory obsahující kusy HTML kódu a prezentační logiky. K zapouzdření prezentační logiky lze využít tzv. View komponent (obdoba UserControls, ale většinou mnohem obecnější). Existují tu i layouty, což je obdoba MasterPages.

<html>
  <head>
    <title>Layout</title>
  </head>
  <body>
    ${ChildOutput}
    <p class="footer">Společná patička.</p>
  </body>
</html>

Takto vypadá velice zjednodušený layout. ${ChildOutput} bude nahrazen obsahem jednotlivých view.

Controler

Kontroler spojuje svět View se světem Modelu. Řídí činnost view mění stavy Modelu. Je to to, co dělá aplikaci aplikací.

[Scaffolding(typeof(User))]
public class UsersController : Controller {
}

Teď když zadáme něco jako http://localhost:12345/users/new.rails tak dostaneme formulář pro zadávání nových uživatelů. (V případě, že doimplementujeme třídu User, aby měla všechny potřebné vlastnosti).

Pro dnešek bych tedy ukončil první představovací článek a v příštích spotech bychom se mohli podívat na tuto zajímavou technologii trošku blíž…

Autor: Aleš Roubíček | Zatím bez komentáře | Delicious | FriendFeed | Facebook | Linkuj!