ASP.NET MVC. Michal Horák 2008



Podobné dokumenty
Michal Augustýn Microsoft Most Valuable Professional

Michal Augustýn ALWIL Software Microsoft Most Valuable Professional

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

Bottle -- příklad. Databáze. Testovací data. id Jedinečný identifikátor řádku: Bude typu INT s AUTO_INCREMENT a nastavíme ho jako primární klíč

Tvorba WWW stránek. přehled technologií používaných na webu principy jednotlivých technologií a možnosti jejich vzájemného kombinování

Ing. Přemysl Brada, MSc., Ph.D. Ing. Martin Dostal. Katedra informatiky a výpočetní techniky, FAV, ZČU v Plzni

Zabezpečení webové vrstvy a EJB projektu Část nastavení specifická pro Glassfish, část dána Java EE

Jak vznikala webová aplikace kolonizace.asp2.cz

MS SQL Server 2008 Management Studio Tutoriál

Programování v jazyku C# II. 8.kapitola

Ruby on Rails. Bc. Tomáš Juřík Bc. Bára Huňková

Formuláře. Aby nám mohli uživatelé něco hezného napsat třeba co si o nás myslí!

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Dynamické stránky v praxi. Bedřich Košata

Stručný úvod pro programátory. Michal Kuchta

KIV/PIA 2013 Jan Tichava

Jazyk C# - přístup k datům

Návrh a tvorba WWW stránek 1/14. PHP a databáze

Inovace a zkvalitnění výuky prostřednictvím ICT Tvorba webových stránek. Ing. Zelinka Pavel Číslo: VY_32_INOVACE_35 17 Anotace:

Návrh a tvorba WWW stránek 1/8. Formuláře

KIV/PIA Semestrální práce

IS pro podporu BOZP na FIT ČVUT

Sem vložte zadání Vaší práce.

Jaku b Su ch ý 1

Plánování a vývoj základního frameworku

Uživatelská příručka 6.A6. (obr.1.)

KAPITOLA 3. Architektura aplikací na frameworku Rails. V této kapitole: modely, pohledy, řadiče.

Internet cvičení. ZS 2009/10, Cvičení 3., Tomáš Pop. DISTRIBUTED SYSTEMS RESEARCH GROUP

Tvorba aplikací v Oracle Application Express

Individuální projekt z předmětu webových stránek Anketa Jan Livora

Použití databází na Webu

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

DUM 14 téma: Interakce s uživatelem

Postup. Úvodem. Hlavní myšlenka frameworku. application. system. assets. uploads

Uživatelský manuál aplikace. Dental MAXweb

17. července :51 z moravec@yahoo.com

APS Administrator.ST

Technologie Java Enterprise Edition. Přemek Brada, KIV ZČU

Příloha 6. Palety nástrojů

Vývoj informačních systémů. Architektura, návrh Vzory: Doménová logika

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové technologie

Webová stránka. Matěj Klenka

Rezervační systém Tvorba WWW stránek

Základy HTML, URL, HTTP, druhy skriptování, formuláře

NÁVOD NA OBSLUHU INTERNETOVÉ PREZENTACE. Ataxo Czech s.r.o.

Databáze EMS podacích lístků

Vytvoření pokročilé Fotogalerie v Drupalu - Views

Implementační manuál aplikace Essox Lite pro programátora/webmastera e-shopu

Databázové a informační systémy

Server-side technologie pro webové aplikace

Tvorba informačních systémů

Vývoj informačních systémů. Architektura, návrh Vzory: Doménová logika

Maturitní projekt do IVT Pavel Doleček

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 26.3.

Koláčky, sezení. Martin Klíma

APS Web Panel. Rozšiřující webový modul pro APS Administrator. Webové rozhraní pro vybrané funkce programového balíku APS Administrator


PŘEHLED A MOŽNOSTI VYUŽITÍ WEBOVÝCH MAPOVÝCH SLUŽEB

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Novinky ve Visual Studio Tomáš Kroupa

Postup instalace ČSOB BusinessBanking pro MS SQL 2005/2008

PHP a Large Objecty v PostgreSQL

Internet cvičení. ZS 2009/10, Cvičení 4., PHP. Tomáš Pop. DISTRIBUTED SYSTEMS RESEARCH GROUP

REGIONÁLNÍ INFORMAČNÍ SYSTÉM S PODPOROU MAP

Vazba ESO9 na MS Outlook a MS Exchange

Jak vytvořit nebo předělat vlastní motiv pro SunLight CMS

WCF RIA Services. aneb jak na RIA aplikace v Silverlightu

EMBARCADERO DATASNAP. OBSAH Úvod... 2 DataSnap a DBExpress... 2 Serverová část... 2 VCL Klient... 6 Nasazení... 7

Vývojařská Plzeň AngularJS

Tvorba informačních systémů

Po stisku Next se nám objeví seznam dostupných tříd (naše zkompilovaná třída User.KBI), viz následující obrázek.

Kurz Databáze. Přechod na SQL server. Obsah. Vytvoření databáze. Lektor: Doc. Ing. Radim Farana, CSc.

Příručka pro editaci kontaktů na eagri

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Jazyk C# - přístup k datům

Historie. Mapový podklad. Aktuální stav jednotek

Django. Webový framework pro Python Projekt = webová stránka Aplikace = určitá funkcionalita webu

1 Administrace systému Moduly Skupiny atributů Atributy Hodnoty atributů... 4

Pantek Productivity Pack. Verify User Control. Uživatelský manuál

1. Úvod do Ajaxu 11. Jak Ajax funguje? 13

Dobrý CMS Popis produktu a jeho rozšíření

Manuál pro obsluhu Webových stránek

1. Struktura stránky, zásady při psaní kódu, MVC pattern. Web pro kodéry (Petr Kosnar, ČVUT, FJFI, KFE, PINF 2008)

Tvorba informačních systémů

DIPL 2. Stručný manuál pro vysokoškolské kvalifikační práce.

RESTful API TAMZ 1. Cvičení 11

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové aplikace

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

PHP framework Nette. Kapitola Úvod. 1.2 Architektura Nette

Úvod do Entity Frameworku

Tento projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem České republiky. PORTÁL KUDY KAM. Manuál pro editaci ŽS. Verze 1.

Personální evidence zaměstnanců

Historie, současnost a budoucnost ASP.NET

Informační systém pro e-learning manuál

INFORMAČNÍ SYSTÉMY NA WEBU

AJAX. Dynamické změny obsahu stránek

Redakční systém Joomla. Prokop Zelený

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Část IV - Bezpečnost 21. Kapitola 19 Bezpečnostní model ASP.NET 23

Transkript:

Model View Controller ASP.NET MVC Michal Horák 2008 Základem ASP.NET MVC je návrhový vzor (někdy se také říká architektonický vzor, protože jde spíše o architekturu aplikace) Model View Controller. Tento vzor poprvé popsal Trygve Reenskaug v roce 1979 a poprvé byl použit v jazyce Smalltalk. Model View Controller se, jak je z názvu vidět, skládá ze tří částí: 1. Model Implementace business logiky Persistence dat 2. View Uživatelské rozhraní 3. Controller Zpracování požadavků Použití modelu Navigace mezi View

Princip MVC Uživatel provede nějakou akci na uživatelském rozhraní, Controller obdrží oznámení o této akci z uživatelského rozhraní (View) a následně Controller přistoupí k modelu a v případě potřeby ho zaktualizuje na základě provedené akce. Model je pouze jiný název pro doménovou vrstvu, doménová logika zpracuje změněná data a View získá data přímo z modelu a model o View nemá žádné informace. Uživateslké rozhraní pak čeká na další akci uživatele, které celý cyklus zahájí znovu. Implementace MVC V současné době se MVC používá především jako architektura webových aplikací, kde se hodí především pro složitější aplikace, kde zajišťuje flexibilitu a spolehlivost. Příklady implementací JavaServer Faces Zend Framework Cake PHP Ruby on Rails ASP.NET MVC ASP.NET MVC ASP.NET MVC je implementace MVC pro ASP.NET, jde o alternativu k webforms, nikoliv však jeho náhradou. Spoustu věcí z klasického ASP.NET lze i nadále používat. Ke svému fungování využívá infrastruktury HTTP handlerů a HTTP modulů (Pro mapování url pravidel na akce Controlleru). ASP.NET MVC vs. ASP.NET WebForms V ASP.NET MVC máme tedy alternativu k ASP.NET Webforms, jaké jsou tedy mezi nimi rozdíly? Web forms MVC Využívá Page controller pattern Postback ViewState Server controls Využívá Model View Controller pattern Požadavky směřují na controllery Controllery jsou separovány od view ASPX stránky slouží jako šablony na data

Výhody a nevýhody ASP.NET MVC Výhody Lepší oddělení logiky od prezentace Kontrola nad generovaným kódem prezentace Snazší testovatelnost Hezčí tzv. SEO Friendly url Nevýhody Složitější implementace Nemožnost používat komponenty využívající viewstate a postback Oddělení logiky od prezentace Z popisu MVC je oddělení logiky od prezentace jasně viditelné, ASP.NET MVC přímo nutí programátora, aby oddělil logiku od prezentace. Je to dáno tím, že Prezentace je Views, která získává controllerem aktualizovaná data z modelu. View tedy pouze zobrazuje již připravená data a je tedy pouhou šablonou, která nám říká, co se má kde zobrazit. Projekt ASP.NET MVC Vytvoření projektu ve Visual Studiu Pro vytvoření projektu ve Visual Studiu potřebujeme mít buď nainstalované Visual Studio ASP.NET MVC Extension nebo mít minimálně Visual Studio 2008 SP1 a.net Framework 3.5 SP1. I přesto, že jde o webový projekt, tak jej nevytváříme tak, že ve visual studiu vybereme File->New->Web Site, ale File->New->Project. Objeví se známé dialogové okno, kde si vybereme kategorii Web. V této kategorii máme položku ASP.NET MVC Web Application, to je přesně ta položka, kterou chceme. Takže ji vybereme a potvrdíme, před vytvořením projektu budete dotázáni, jestli také vytvořit testovací projekt, to samozřejmě doporučuji. Takže máme vytvořený nový projekt, podívejme se na něj. Máme v něm následující složky: Content zde je uložen soubor s kaskádovými styly, můžeme sem také přidat všechny ostatní soubory, které mají něco společného s grafikou či jiným obsahem podobného typu. Různé fotky, obrázky atd. Obrázek 1: Nový projekt ASP.NET MVC

Controllers v této složce jsou uloženy Controllery Models v novém projektu je tato složka prázdná, model si musíme nejdříve vytvořit, o tom později. Scripts zde jsou uloženy soubory pro skriptování na straně klienta, převážne tedy JavaScripty, ve výchozím projektu zde máme javascriptové knihovny pro Ajax a také JQuery. Views je složka určená pro Views, tedy stránky prezentační vrstvy. Views Ve složce Views má každý Controller svoji složku a v této složce jsou aspx stránky, které přidáváme jako nový View. Stačí na tuto složku kliknout pravým tlačítkem a vybrat Add -> View. Zobrazí se dialogové okno, které si popíšeme: Jak je vidět, stejně jako u klasického ASP.NET MVC je možné používat Master Page. Dále je tu ještě jeden Cheb box, který z klasického ASP.NET neznáme a to Create a strongly-typed view. Jde o to, že můžeme mít View jako generickou třídu a tedy rovnou nastavit datový typ, který bude view akceptovat. Tento datový typ si můžeme rovnou vybrat z modelu, popřípadě lze vždycky upravit. Jestliže si tuto možnost neodškrtneme a budeme jej chtít použít, potom stačí když tento view zdědíme z generického typu ViewPage<T>. K datům se ve stránce dostaneme přes ViewData.Model. Příklad View <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MVC_pokus.Views.Home.Index" %> <asp:content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> <h2><%= Html.Encode(ViewData["Message"]) %></h2> <p> To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="asp.net MVC Website">http://asp.net/mvc</a>.</p>

Controllers Controller je třída zděděná ze System.Web.Mvc.Controller, která implementuje rozhraní IController. Obsahuje metody s návratovou hodnotou ActionResult a nejčastěji budou vracet: View() vrátí View odpovídající názvu metody ve které se nachází RedirectToAction() přesměruje na další akci ContentResult() předává obsah bez vlastního View Controller příklad using System.Web.Mvc.Ajax; namespace MVC_pokus.Controllers [HandleError] public class HomeController : Controller public ActionResult Index() ViewData["Title"] = "Home Page"; ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); public ActionResult About() ViewData["Title"] = "About Page"; return View(); Models V modelu si můžeme napsat svoji Business logiku, nebo u některých projektů se vyplatí vygenerovat si třídy pomocí LINQ to SQL Clasess, nebo NHibernate. Podpora skriptů na straně kilenta Když se podíváme do složky Scripts, tak si všimneme, že jsou tam už nějaké scripty vloženy, konkrétně JQuery MS Ajax MS MVC AJAX

Tato podpora je spíše jen taková, že zde tyto skripty jsou, ovšem pomocí jquery se dají dělat divy a určitě stojí za vyzkoušení. Stejně jako v ASP.NET MVC se dají použít i v klasickém ASP.NET nebo i jiných webových technologiích. Unit testy Při vytvoření projektu jste dotázání, zda vytvořit i projekt s UnitTesty. Testování probíhá tak, že máme pro každý controller test a ten spouští akce controlleru s daty, které by jinak přišli z View. Jak je vidět, toto testování je díky dobrému oddělení logiky od prezentace jednodušší než u klasického ASP.NET, kde se spousta akcí vykonává už na stránce. Unit test - příklad using System.Text; using Microsoft.VisualStudio.TestTools.UnitTesting; using MVC_pokus; using MVC_pokus.Controllers; namespace MVC_pokus.Tests.Controllers /// <summary> /// Summary description for HomeControllerTest /// </summary> [TestClass] public class HomeControllerTest [TestMethod] public void Index() // Setup HomeController controller = new HomeController(); // Execute ViewResult result = controller.index() as ViewResult; // Verify ViewDataDictionary viewdata = result.viewdata; Assert.AreEqual("Home Page", viewdata["title"]); Assert.AreEqual("Welcome to ASP.NET MVC!", viewdata["message"]); [TestMethod] public void About() // Setup HomeController controller = new HomeController(); // Execute ViewResult result = controller.about() as ViewResult; // Verify ViewDataDictionary viewdata = result.viewdata; Assert.AreEqual("About Page", viewdata["title"]);

Práce s url cestami (URL mapping) V ASP.NET MVC mapujeme url cesty na konkrétní controller, url cesta je vlastně požadavek a podle požadavku pak daný controller tento požadavek obslouží. Toto mapování je vhodné pro tzv. SEO optimalizaci, protože díky ní snadno vytváříme SEO friendly url. Výchozí nastavení v ASP.NET MVC je [controller]/[action]/[id], které si ovšem můžeme snadno změnit. Když se podíváme do souboru Global.asax.cs, tak uvidíme následující: using System.Web.Routing; namespace MVC_pokus public class MvcApplication : System.Web.HttpApplication public static void RegisterRoutes(RouteCollection routes) routes.ignoreroute("resource.axd/*pathinfo"); routes.maproute( "Default", // Route name "controller/action/id", // URL with parameters new controller = "Home", action = "Index", id = "" // Parameter defaults ); protected void Application_Start() RegisterRoutes(RouteTable.Routes); Jak je vidět, pomocí metody RegisterRoutes si můžeme toto mapování pro své potřeby upravit a není to nijak složité. Závěr? ASP.NET MVC je součástí Visual Studia 2008 SP1 s nainstalovaným.net frameworkem 3.5 SP1. Více o ASP.NET MVC se dozvíte na stránkách http://www.asp.net/mvc/, kde je k nalezení i spousta tutoriálů a videí.

Příklad ASP.NET MVC aplikace Jednoduchý blog Jako příklad zde máme jednoduchý blog, který bude umět následující: 1. přihlášení a odhlášení uživatele, 2. zobrazení článků, 3. vkládání, mazání a editace článků Nejdříve si vytvoříme nový projekt nazvaný například MVCweb. Přidáme do něj databázi, následující podoby: Articles ID (int) Primary Key Title (nvarchar(250)) Content (ntext) date(datetime) IsVisible (bit) Users ID (int) Primary Key login (nvarchar(250)) password (navrachar(250)) Do složky Models vložíme LINQ to SQL Clasess a vložíme do něj tyto dvě tabulky. Tím jsme si vytvořili jednoduchou logiku aplikace. Model máme tedy hotový. Nyní je vhodné si vytvořit základní controller, pro naše případy do něj vložíme pouze property IsLogin: BaseController.cs using System.Web.Mvc.Ajax; namespace MVCweb.Controllers public class BaseController : Controller protected bool islogin get bool login = false; if (Session["isLogin"] == null) return false; bool.tryparse(session["islogin"].tostring(), out login); return login;

set Session["isLogin"] = value; No a controllery si uděláme dva Home a Login, i když by se blog dal rozdělit klidně i na tři (Home, Admin, Login). HomeController.cs V tomto controlleru budeme reagovat na následující akce: Index zobrazení posledních článků Article zobrazení jednoho článku Create zobrazení formuláře pro vytvoření článku CreateNew uložení nového článku Edit zobrazení formuláře pro editaci článku EditArticle uložení editovaného článku DeleteArticle odstranění článku VisibleArticle zviditelnění článku pro Index Admin zobrazení článků pro editaci LoginController.cs V Login controlleru máme pouze tři akce: Index zobrazení formuláře pro přihlášení Login přihlášení uživatele Logout odhlášení uživatele Zde si ukážeme i zdrojový kód: using System.Web.Mvc.Ajax; using MVCweb.Models; namespace MVCweb.Controllers public class LoginController : BaseController private myblogdatacontext db = new myblogdatacontext(); public ActionResult Index() return View();

public ActionResult Login(string login, string password) var user = from u in db.users where u.login == login && u.password == password select u; if (user.tolist().count > 0) islogin = true; return RedirectToAction("Index", "Home"); return RedirectToAction("Index"); public ActionResult Logout() islogin = false; return RedirectToAction("Index", "Home"); Jak vidíte tak při akci Login a Logout přesměrováváme na akci v jiném controlleru, toto jsme si zatím neukázali. Controllery tedy máme hotové a již chybí pouze Views. Tak tedy, pro každý controller musíme mít udělanou složku ve složce Views. Máme tedy složky Home a Login. Také je dobré si vytvořit master page. Když se podíváme na akce controlleru Home, tak zjistíme, že pět z nich nám vrací pohled, pro tyto akce tedy musíme mít udělanou stránku: Admin Article Create Edit Index Stejně tak pro Login, zde máme pouze jednu stránku s přihlašovacím formulářem Index. Kompletní zdrojové kódy naleznete v příloze, soubory, které zůstaly výchozí jsou vynechány. Stejně tak jako zdrojové kódy modelu, který je vygenerován pomocí LINQ to SQL Clasess, jsou vynechány.

Příloha: kompletní zdrojové kódy příkladu BaseController.cs using System.Web.Mvc.Ajax; namespace MVCweb.Controllers public class BaseController : Controller protected bool islogin get bool login = false; if (Session["isLogin"] == null) return false; bool.tryparse(session["islogin"].tostring(), out login); return login; set Session["isLogin"] = value; HomeController.cs using System.Web.Mvc.Ajax; using MVCweb.Models; namespace MVCweb.Controllers public class HomeController : BaseController private myblogdatacontext db = new myblogdatacontext(); // Display List of Last Articles public ActionResult Index() var articles = from a in db.articles where a.isvisible orderby a.date descending select a; return View(articles.ToList());

// Form for Create a new Article public ActionResult Create() if (islogin) return View(); return RedirectToAction("Index", "Login"); // Save Article to database public ActionResult CreateNew(string title, string content) if (islogin) Article newarticle = new Article(); newarticle.title = title; newarticle.content = content; newarticle.date = DateTime.Now; newarticle.isvisible = false; a; db.articles.insertonsubmit(newarticle); db.submitchanges(); return RedirectToAction("Admin"); return RedirectToAction("Index", "Login"); // Show Edit View public ActionResult Edit(int id) if (islogin) var article = from a in db.articles where a.id == id select return View(article.Single()); return RedirectToAction("Index", "Login"); // Show Article View public ActionResult Article(int id) var article = from a in db.articles where a.id == id select a; this.viewdata["title"] = article.single().title; return View(article.Single()); // Delete Article public ActionResult Delete(int id) if (islogin)

a; var article = from a in db.articles where a.id == id select db.articles.deleteonsubmit(article.single()); db.submitchanges(); return RedirectToAction("Admin"); return RedirectToAction("Index", "Login"); // Show articles to admin public ActionResult Admin() if (islogin) var articles = from a in db.articles orderby a.date descending select a; return View(articles.ToList()); return RedirectToAction("Index", "Login"); // Edit Article public ActionResult EditArticle(int articleid, string title, string content) if (islogin) var articles = from a in db.articles where a.id == articleid select a; foreach (Article a in articles) a.content = content; a.title = title; a.date = DateTime.Now; db.submitchanges(); return RedirectToAction("Admin"); return RedirectToAction("Index", "Login"); // Set Article as Visible or Invisible public ActionResult VisibleArticle(int id) if (islogin) var articles = from a in db.articles where a.id == id select a; MVCweb.Models.Article article = articles.single(); article.date = DateTime.Now;

if (article.isvisible) article.isvisible = false; article.isvisible = true; db.submitchanges(); return RedirectToAction("Index"); return RedirectToAction("Index", "Login"); LoginController.cs using System.Web.Mvc.Ajax; using MVCweb.Models; namespace MVCweb.Controllers public class LoginController : BaseController private myblogdatacontext db = new myblogdatacontext(); public ActionResult Index() return View(); public ActionResult Login(string login, string password) var user = from u in db.users where u.login == login && u.password == password select u; if (user.tolist().count > 0) islogin = true; return RedirectToAction("Index", "Home"); return RedirectToAction("Index"); public ActionResult Logout()

islogin = false; return RedirectToAction("Index", "Home"); Views/Home/Admin.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Views/myBlog.Master" AutoEventWireup="true" CodeBehind="Admin.aspx.cs" Inherits="MVCweb.Views.Home.Admin" %> <asp:content ID="Content1" ContentPlaceHolderID="head" runat="server"> <asp:content ID="Content2" ContentPlaceHolderID="contentPlace" runat="server"> <a href="/home/create">create new Article</a> <ul> <% foreach(mvcweb.models.article article in ViewData.Model)%> <li><a href="/home/edit/<%= article.id %>">Edit</a> <a href="/home/delete/<%= article.id %>">Delete</a> <%= article.date %> <%= article.title %> </li> <% %> </ul> Views/Home/Admin.aspx.cs using MVCweb.Models; namespace MVCweb.Views.Home public partial class Admin : ViewPage<List<MVCweb.Models.Article>> Views/Home/Article.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Views/myBlog.Master" AutoEventWireup="true" CodeBehind="Article.aspx.cs" Inherits="MVCweb.Views.Home.Article" %> <asp:content ID="Content1" ContentPlaceHolderID="head" runat="server"> <asp:content ID="Content2" ContentPlaceHolderID="contentPlace" runat="server"> <h2><%= ViewData.Model.date.ToShortDateString() %> <%= ViewData.Model.Title %></h2> <%= ViewData.Model.Content %>

Views/Home/Article.aspx.cs using MVCweb.Models; namespace MVCweb.Views.Home public partial class Article : ViewPage<MVCweb.Models.Article> Views/Home/Create.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Views/myBlog.Master" AutoEventWireup="true" CodeBehind="Create.aspx.cs" Inherits="MVCweb.Views.Home.Create" %> <asp:content ID="Content1" ContentPlaceHolderID="head" runat="server"> <asp:content ID="Content2" ContentPlaceHolderID="contentPlace" runat="server"> <h1>create new Article</h1> <form action="/home/createnew" method="post"> <label for="title">title</label> <input type="text" id="title" name="title" /> <label for="content">content</label> <textarea id="content" cols="20" rows="10" name="content"></textarea> <input type="submit" value="add new Article" /> </form> Views/Home/Edit.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Views/myBlog.Master" AutoEventWireup="true" CodeBehind="Edit.aspx.cs" Inherits="MVCweb.Views.Home.Edit" %> <asp:content ID="Content1" ContentPlaceHolderID="head" runat="server"> <asp:content ID="Content2" ContentPlaceHolderID="contentPlace" runat="server"> <h2>edit article</h2> <form action="/home/editarticle" method="post"> <%= Html.Hidden("aticleID", ViewData.Model.ID) %> <label for="title">title</label> <%= Html.TextBox("title", ViewData.Model.Title) %> <label for="content">content</label> <%= Html.TextArea("content", ViewData.Model.Content, 10, 20, null)%> <input type="submit" value="edit article" /> </form> <%if (ViewData.Model.IsVisible) %> <a href="/home/visiblearticle/<%= ViewData.Model.ID %>">Visible article</a> <% %>

Views/Home/Edit.aspx.cs using MVCweb.Models; namespace MVCweb.Views.Home public partial class Edit : ViewPage<MVCweb.Models.Article> Views/Home/Index.aspx <%@ Page Title="My Blog" Language="C#" MasterPageFile="~/Views/myBlog.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MVCweb.Views.Home.Index" %> <asp:content ID="Content1" ContentPlaceHolderID="head" runat="server"> <asp:content ID="Content2" ContentPlaceHolderID="contentPlace" runat="server"> <ol> <% foreach(mvcweb.models.article article in ViewData.Model)%> <li><h2><a href="./article/<%= article.id.tostring() %>"><%= article.date.toshortdatestring() %> <%= article.title %></a></h2> <%= article.content %> </li> <% %> </ol> Views/Home/Index.aspx.cs using MVCweb.Models; namespace MVCweb.Views.Home public partial class Index : ViewPage<List<MVCweb.Models.Article>> Views/Login/index.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Views/myBlog.Master" AutoEventWireup="true" CodeBehind="index.aspx.cs" Inherits="MVCweb.Views.Login.index" %>

<asp:content ID="Content1" ContentPlaceHolderID="head" runat="server"> <asp:content ID="Content2" ContentPlaceHolderID="contentPlace" runat="server"> <h2>login page</h2> <form action="/login/login" method="post"> <label for="login">login</label> <input type="text" id="login" name="login" /> <label for="password">password</label> <input type="password" id="password" name="password" /> <input type="submit" value="login" /> </form> Views/myBlog.Master <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="myBlog.Master.cs" Inherits="MVCweb.Views.myBlog" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>myblog</title> <link href="~/content/site.css" rel="stylesheet" runat="server" type="text/css" /> <asp:contentplaceholder ID="head" runat="server"> </asp:contentplaceholder> </head> <body> <div id="page"> <h1><a href="/home/">my Blog</a></h1> <asp:contentplaceholder ID="contentPlace" runat="server"> </asp:contentplaceholder> </div> <div id="footer"> <a href="/home/admin">administrate Blog</a> </div> </body> </html>