SlideShare a Scribd company logo
1 of 35
Introduction to ASP 3.5 SP1
Model, View, Controller (MVC 1.0 RTM)
                               Michał Morciniec
                         micham @microsoft.com
                           GPSD, Microsoft Spain




                                     24 March2009
Agenda
• ASP.Net MVC Architecture
  – Comparación con ASP.Net (“Web Forms”)
• URL Routing and its use by MVC
• MVC Components
  – Model
  – Controller
       • Actions and their parameters
    – Views
       • Data passing to Views
       • HTML Helpers
       • Partial Views(ViewUserControl)
• Form Processing by actions
  – ModelBinder, ModelState, UpdateModel
  – Data Validation
• Unit Tests in ASP.Net MVC
• Demo


2
Environment

• Microsoft .NET Framework 3.5 Service Pack 1 -recomendado
• http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=
  ab99342f-5d1a-413d-8319-81da479ab0d7

• Microsoft Visual Studio 2008 Service Pack 1 (Installer) - recomendado
• http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=
  fbee1648-7106-44a7-9649-6d9f6d58056e

• ASP.NET MVC 1.0 (RTM)
• http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-
  43bf-b6a6-35e00103cb4b&displaylang=en

     • Copies System.Web.Mvc.dll to GAC and folder
       %ProgramFilesMicrosoft ASP.NETASP.NET MVC 1.0
       Assemblies
• VS 2008 Professional Edition required for unit tests

3
MVC as an Architectural Pattern
    Pattern involving three components
•
    An alternative to ASP.Net Forms
•
    Leverages ASP.Net functionality                       Object mainaining
•
                                                          application state
    “Lives” in System.Web.Mvc
•

                                                      Model




                         Components for data
                                               View              Controller
                         visualization



                                                      Components that process user
                                                      Interaction, consult Model and
                                                      present a view



4
Comparing MVC with ASP.Net Web Forms
• MVC Advantages
  – Better complexity management (separation)
  – Developer has a total control over application
  – Complex routing scenarios possible
  – Better support for Test-Driven-Development
  – Works well in large teams of developers and designers

• ASP.Net Web Forms Advantages
  – Event based model maintains the state over HTTP requests
  – Server generates pages and maintains the state
  – Works well for small developer teams
  – Reduces development complexity (server processes controls)




5
ASP.Net Functionality compatible with MVC
    In-line Expressions <%= %>
•
    Master Pages (nested)
•
    Localization
•
    Data-Binding
•
    Templating
•
    URL Autorization
•
    Forms Authentication
•
    Membership and Roles
•
    Provider Architecture
•
    Output and Data Caching
•
    Session and Profile State Management
•
    Health Monitoring
•
    Configuration System
•




6
ASP.Net Functionality not used by MVC
• Postbacks (all interactions are handled by Controller)
  – View State,
  – Lifecycle events of the ASP.Net Web Page




7
Examples of Sites using ASP.Net MVC
• http://www.stackoverflow.com
  – Receives more than 300K visits a day –more detail in
    http://channel9.msdn.com/pdc2008/PC21/

    http://www.cruvee.com/
•
    http://www.ideavine.net/
•
    http://www.theloungenet.com/
•
    http://www.retaggr.com/
•
    http://www.visitmix.com/
•




8
URL Routing
• “classic” ASP.Net (with no URL Routing)
  – URL identifies physical resource in server

     http://server/application/Products.aspx?id=4

    • ASP.Net MVC uses URL Routing (introduced in .Net 3.5)
      – URL does not identify physical resource
      – URL is parsed according to Route Definition

      http://server/application/Products/List/drinks          Matching URL


                               {controller}{action}{id}       Route Definition




9
URL Routes Definition (in General)
• Route object is added to routing table in Global.asax
• Constructor accepts:
  – URL Route Definition pattern
  – Route handler instance (implements
    System.Web.Routing.IRouteHandler)


     protected void Application_Start(object sender, EventArgs e)
             {
                 RegisterRoutes(RouteTable.Routes);
             }

            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.Add(new Route
                (
                     quot;Category/{action}/{categoryName}quot;
                     , new CategoryRouteHandler()
                ));
            }

10
URL Routing in MVC
• ASP.Net MVC uses ASP.Net Routing to:
  – Map URLs to Controllers and Actions
  – ASP.Net Routing parses URL query strings and passes them as action
    parameters in Controllers
  – Function MapRoutes adds MVC route
  – Function IgnoreRoutes excludes route from MVC processing



     public static void RegisterRoutes(RouteCollection routes)
       {
       routes.IgnoreRoute(quot;{resource}.axd/{*pathInfo}quot;);
       routes.MapRoute(
          quot;Defaultquot;,
          quot;{controller}/{action}/{id}quot;,
          new { controller = quot;Homequot;, action = quot;Indexquot;, id = quot;quot; }
          );
       }



11
MVC - Model
                                            Model
• Objects that maintain application state
• Interact with repository (database)
• Controller creates them in Actions and
  passes them to Views
• View accesses data in the Object

• Examples: DataSet, DataReader, LINQ
  to SQL, etc.
• Model calses are stored in Models
  directory (or other assembly)




12
MVC - Controller
  • Class with“Controller” suffix                              Controller
    – Actions are public methods
    – Implement business logic
    – View() function passes model object to View
  • Controller exposes
    – Request y Response objects (accessible in
      actions)
    – They correstpond to HttpRequest and
      HttpResponse
[HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewData[quot;Titlequot;] = quot;Home Pagequot;;
            ViewData[quot;Messagequot;] = quot;Welcome to ASP.NET MVC!quot;;
            return View();
        }
  }
  13
Controller Creation in VS 2008 SP1
 • Can generate Actions to:
   – Create
   – Edit
   – Show Detail of the entity




 // GET: /Test/Edit/
public ActionResult Edit(int id) {
            return View();
}
// POST: /Test/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection collection) {
  try {
// TODO: Add update logic here
  return RedirectToAction(quot;Indexquot;);
  }
  catch {
    return View();
  }
}
 14
MVC – Controller Actions
• Actions correspond to user interactions
  – URL entered in browser
  – Html Link clicked
  – Form posted, etc.
• Modeled as a public Controller method
  – Returns ActionResult
  – Attribute[NonAction] excludes method from MVC processing

Método                   Típo de ActionResult
View()                   ViewResult
RedirectToAction()       RedirectToRouteResult
RedirectToRoute()
Redirect()               RedirectResult
Json()                   JsonResult
Content()                ContentResult
Acción “sin resultado”   EmptyResult



15
MVC – Controller Action Parameters
  • Action parameters are derived from Http Request object
    – Form data (name-value)
    – “URL Query string values”
    – “Cookie values”

  • Parameter mapping is automatic:
    – For route {controller}/{action}/{id}
        • URL Query string values /Products/Detail?id=5
        • Or URL suffix /Products/Detail/5
        • Gives us parameter id=5          public ActionResult
  • Parameter support Nullable             ShowArticles(DateTime? date)
                                             {
public ResultAction Detail(int id)
                                               if (!date.HasValue) {
  {
                                                    date = DateTime.Now;
   ViewData[quot;DetailInfoquot;] = id;
                                               }
   return View(quot;Detailquot;);
                                           }
  }




  16
Action Attributes [AcceptVerbs] and [ActionName]
 • [AcceptVerbs] allows to use same URL for GET and POST
   – /Products/InsertCategory
       [AcceptVerbs( HttpVerbs.Get)]
       public ActionResult InsertCategory ()
         {
       // muestra vista con formulario vacío
         }

       [AcceptVerbs( HttpVerbs.Post)]
       public ActionResult InsertCategory (Category category)
         {
       // procesa formulario y guarda objeto
         }

• [ActionName ] allows to have name of action different from function name
      [ActionName=“InsertCategory”,AcceptVerbs(HttpVerbs.Post)]
      public ActionResult SaveCategory (Category category)
        {
      // procesa formulario y guarda objeto
        }




 17
MVC - View
                                                                   View
• An instance of System.Web.MVC.ViewPage,
  – Implements IViewDataContainer
  – Property ViewData.Model contains model object if
    passed from controller
• View pages are stored according to pattern:
  – Views/{controller}/{view}.aspx
                                                Category.aspx
     <%@ Page Title=“Categoryquot; Language=quot;C#quot;
     MasterPageFile=quot;~/Views/Shared/Site.Masterquot;
     AutoEventWireup=quot;truequot;
     CodeBehind=quot;Category.aspx.csquot;
     Inherits=quot;NorthwindMVC.Views.Products.Categoryquot;
     %>
     • Views (property Model) can be “strongly typed”
                                                Category.aspx.cs
     public partial class Category :
     ViewPage<NorthwindMVC.Models.Category>
          • In RC1 “code behind” for Views has been
            eliminated – to facilitate IntelliSence
18
MVC– View Creation in VS2008 (MVC RC1)
• CTRL+M, CTRL+V
• Allows to
  – Specify master page
  – Specify view type
  – Create partial view
  – Generate view
    implementation for
    Create, Edit, Details and List
    operations




19
MVC– Passing Data to “loosely typed” View
• Controller passes data to Views
  in actions                                                   ProductsController.cs
• ViewData.Model contains            public ActionResult Categories() {
                                     List<Category> categories =
  model object passed to View()               northwind.GetCategories();
• In “loosely typed” Views:           return View(“Indexquot;, categories); }

  – Explicit type conversion is
     required
                                    Nombre de Vista
                                                                       Datos
                                                                   Index.aspx
                                    <%@ Page …%>
                                    <asp:Content ID=quot;Content1quot; …>
                                    <%@ Import
                                    Namespace=quot;NorthwindMVC.Modelsquot; %>
                                    <% List<Category> cat = ViewData.Model
                                    as List<Category>;
                                        Response.Write(quot;View Data has quot; +
                                    cat.Count+ quot; objects.quot;); %>
                                    </asp:Content>
                                                                Index.aspx.cs
                                    public partial class Index : ViewPage
                                        {}

20
MVC– Passing Data to “strongly typed” View
• In “strongly typed” Views:
                                                            ProductsController.cs
  – ViewData.Model is of
     assigned type             public ActionResult ShowCategory(int id){
                                 db = GetDbContext();
                                 Category cat = (from c in db.Categories
                                                where c.CategoryID == id
                                                select c).Single();
                                 return View(quot;Categoryquot;, cat);        }



                                                               Category.aspx
                                <%@ Page …%>
                                <asp:Content ID=quot;Content1quot; …>
                                …
                                <td><%=ViewData.Model.CategoryName%></td>
                                <td><%=ViewData.Model.Description %></td> …
                                </asp:Content>


                                                              Category.aspx.cs
                                public partial class Index :
                                ViewPage<NortwindMVC.Models.Category>
                                    {}


21
MVC– Passing Data to View using ViewData
• Controller passes data using
                                                            HomeController.cs
  ViewDataDictionary
                                 public ActionResult Index(){
                                   ViewData[quot;Titlequot;] = quot;Home Pagequot;;
• In Views this dictionary is      ViewData[quot;Messagequot;] = quot;Welcome to
  accessible through ViewData                              ASP.NET MVC!quot;;
                                   return View();}




                                                               Index.aspx
                                  <%@ Page …%>
                                  <asp:Content ID=quot;Content1quot; …>
                                  …         <h2><%=
                                  Html.Encode(ViewData[quot;Messagequot;]) %></h2>
                                  </asp:Content>




22
MVC– View Gerneration using HTML Helpers
 • Classes that emit HTML controls
   – Examples: CheckBox, RadioButton, ListBox, TextBox ,etc.

Helper Type              Function                     Example of Use                  Explanation
Html.ActionLink          Link to action                                               Executes action
                                                      <%= Html.ActionLink(quot;Editquot;,
                                                      quot;EditCategoryquot;, new { id =
                                                                                      EditCategory passing id
                                                      c.CategoryID})%>
                                                                                      as parameter
Html.BeginForm           Marks beginning of a                                         From will be processed by
                                                      <% using
                                                      (Html.BeginForm(quot;InsertCatego
                         form points to action that                                   InsertCategory action of
                                                      ryquot;, quot;Productsquot;))
                         will process form.                                           ProductsController
                                                      { %>

Html.ValidationSummary   Summary of validation                                        Shows error summary
                                                      <%=Html.ValidationSummary()
                                                      %>
                         errors                                                       that ModelState contains
Html.ValidationMessage   Specifies validatoin error                                   Shows * besinde invalid
                                                      <%=Html.ValidationMessage(quot;De
                                                      scriptionquot;,quot;*quot;) %>
                         message                                                      form field
Html.Hidden              Embeds invisible                                             Action can access
                                                      <%=
                                                      Html.Hidden(Category.Category
                         information                                                  CategoryID parameter
                                                      IDKey,
                                                      ViewData.Model.CategoryID) %>




 23
MVC– Partial Views (ViewUserControl)
    • MVC ViewUserControl can
      encapsulate HTML fragment in a
      component
    • Can be “strongly typed”
      – ViewData.Model will be of the type
        assigned




                                                                       CategoryTemplate.aspx
                CategoryTemplate.aspx.cs   <%@ Control …quot; %>
                                           <tr>
public partial class CategoryTemplate :
                                           <td><%= ViewData.Model.CategoryName%></td>
System.Web.Mvc.ViewUserControl
                                           <td><%= ViewData.Model.Description%></td>
  <NorthwindMVC.Models.Category> {}
                                           <td><%=
                                           Html.ActionLink(quot;Deletequot;, quot;DeleteCategoryquot;, new {
                                           id = ViewData.Model.CategoryID})%>
                                           <%= Html.ActionLink(quot;Editquot;, quot;EditCategoryquot;, new {
                                           id = ViewData.Model.CategoryID})%></td>
                                           </tr>




    24
MVC– Partial View (ViewUserControl)
   • Html.RenderPartial
     helper injects the HTML into                                         ListCategories.aspx
     a View                                <%@ Page …%>
                                           <%@ Import Namespace=quot;NorthwindMVC.Modelsquot; %>
   • Note the use of <% %>                 <asp:Content…>
                                           <table>
                                                <tr>    <th>Category Name</th>
                                                          <th>Category Description</th>
                                                          <th>Actions</th>
                                                </tr>
                                           <% foreach (Category c in ViewData.Model) { %>
                                           <% Html.RenderPartial(quot;CategoryTemplatequot;, c);%>
                                           <% } %>
                                           </table>
                                           </asp:Content>

                                                                       CategoryTemplate.aspx
                CategoryTemplate.aspx.cs   <%@ Control …quot; %>
                                           <tr>
public partial class CategoryTemplate :
                                           <td><%= ViewData.Model.CategoryName%></td>
System.Web.Mvc.ViewUserControl
                                           <td><%= ViewData.Model.Description%></td>
  <NorthwindMVC.Models.Category> {}
                                           <td><%=
                                           Html.ActionLink(quot;Deletequot;, quot;DeleteCategoryquot;, new {
                                           id = ViewData.Model.CategoryID})%>
                                           <%= Html.ActionLink(quot;Editquot;, quot;EditCategoryquot;, new {
                                           id = ViewData.Model.CategoryID})%></td>
                                           </tr>


   25
Model Binders
• MVC uses DefaultModelBinder
• ModelBinder de-serializes object from HTTP stream
  – Looks for form fields according to convention:
  {action parameter}.{class property}
public class Category{
  public string CategoryId { get; set; }
                                                                                  Model
  public string CategoryName { get; set; }
  public string Description{ get; set; }
}

<textarea cols=quot;20quot; id=“category.Descriptionquot; name=quot;Descriptionquot; rows=quot;2quot;>
tools for gardening                                                                View
</textarea>



[AcceptVerbs( HttpVerbs.Post)]                                                   Controller
public ActionResult InsertCategory (Category category){ }

• Convention and inclusion of form fields can be controlled with [Bind]

     [AcceptVerbs( HttpVerbs.Post)]
     public ActionResult InsertCategory
     ([Bind(Prefix=quot;NewCategoryquot;,Include=quot;CategoryName,Descriptionquot;)] Category
     category){ }

26
From Processing –Edit (GET)
     http://localhost/Products/EditCategory/12
                                                                             ProductsController.aspx
                    [AcceptVerbs(HttpVerbs.Get)]
                    public ActionResult EditCategory(int id){
                      Category category = db.Categories.Single<Category>(c => c.CategoryID
                    == id);
                      return View(quot;EditCategoryquot;, category);
                    }




                                                                        EditCategory.aspx
              <asp:Content …>
              <%=Html.ValidationSummary() %>
              <% using (Html.BeginForm())
               { %>
               <%= Html.Hidden(Category.CategoryIDKey,ViewData.Model.CategoryID) %>
               <div>
                Category Name: <%=
              Html.TextBox(Category.CategoryNameKey, ViewData.Model.CategoryName)%>
                <%=Html.ValidationMessage(quot;CategoryNamequot;,quot;*quot;) %>
               …
              <input type=quot;submitquot; title=quot;Updatequot; value='Update' />
              <% } %>
              </asp:Content>
27
Form Processing – Edit (POST)
                                                                    •NewCategory.CategoryId
                                                 + FormCollection   •NewCategory.CategoryName
     http://localhost/Products/EditCategory/12
                                                                    •NewCategory.CategoryDescription


     [AcceptVerbs(HttpVerbs.Post)]
     public ActionResult EditCategory(int id, FormCollection form)
     {
     Category category = db.Categories.Single<Category>(c => c.CategoryID ==
     id);
     try{
     UpdateModel<NorthwindMVC.Models.Category>(category, quot;NewCategoryquot;, new[] {
     quot;CategoryNamequot;, quot;Descriptionquot; });
       category.Validate(ViewData.ModelState);
     if (ModelState.IsValid){
       db.SubmitChanges();
       return RedirectToAction(quot;ListCategoriesquot;, new RouteValueDictionary(new {
     controller = quot;Productsquot;, action = quot;ListCategoriesquot; }));
     }
     else
       return View(quot;EditCategoryquot;, category);
     }
     catch {
       return View(quot;EditCategoryquot;, category);
     }
     }



     UpdateModel() copies matching field values into model
     object properties
28
Form Processing– Create (GET)
     http://localhost/Products/AddNewCategory
                                                                           ProductsController.aspx
                   [AcceptVerbs(HttpVerbs.Get)]
                   public ActionResult AddNewCategory(Category category)
                   {
                     if (category==null) {
                       category = new Category(){CategoryName=quot;quot;,Description=quot;quot;};
                     }
                     return View(quot;AddNewCategoryquot;, category);
                   }




                                                              AddNewCategory.aspx
             <asp:Content …>
             <%=Html.ValidationSummary() %>
             <% using (Html.BeginForm(quot;InsertCategoryquot;, quot;Productsquot;))
                          { %>
               <div>
               Category Name: <%=
             Html.TextBox(Category.CategoryNameKey, ViewData.Model.CategoryName)%>
             <%=Html.ValidationMessage(quot;CategoryNamequot;,quot;*quot;) %>
               </div>
             …
             <input type=quot;submitquot; title=quot;Submitquot; value='Submit' />
             <input type=quot;submitquot; title=quot;Cancelquot; value='Cancel' />
             <% } %>
             </asp:Content>
29
From Processing - Create(POST)
                                                                   •NewCategory.CategoryId
                                                + FormCollection   •NewCategory.CategoryNameKey
     http://localhost/Products/InsertCategory
                                                                   •NewCategory.CategoryDescriptionKey


     [AcceptVerbs( HttpVerbs.Post)]
     public ActionResult
     InsertCategory([Bind(Prefix=quot;NewCategoryquot;,Include=quot;CategoryName,Description
     quot;)] Category category)
       {
       category.Validate(ViewData.ModelState);
       if (ModelState.IsValid){
           AddCategoryToDatabase(category);
           return RedirectToAction(quot;ListCategoriesquot;, new
     RouteValueDictionary(new { controller = quot;Productsquot;, action =
     quot;ListCategoriesquot; }));
       }
       else{
         return View(quot;AddNewCategoryquot;, category);
       }
     }




• [Bind] specifies form fields to be included



30
Data Validation
• Typically model object implement
  IDataErrorInfo and generate validation
  error messages
• Diccionario ViewData.ModelState contains
  the state of the model validation
• ModelState.IsValid() determines if valid
  or no.                                                                         EditCategory.aspx
                              <asp:Content …>
                           <%=Html.ValidationSummary() %>
                           <% using (Html.BeginForm())
                            { %>
                            <%= Html.Hidden(Category.CategoryIDKey,ViewData.Model.CategoryID) %>
                            <div>
                             Category Name: <%=
                           Html.TextBox(Category.CategoryNameKey, ViewData.Model.CategoryName)%>
                             <%=Html.ValidationMessage(quot;CategoryNamequot;,quot;*quot;) %>
                            </div>
                            <div>
                               <div>
                                  Description:
                               </div>
                               <%= Html.TextArea(Category.DescriptionKey,ViewData.Model.Description) %>
                               <%=Html.ValidationMessage(quot;Descriptionquot;,quot;*quot;) %>
                            </div>
                           <input type=quot;submitquot; title=quot;Updatequot; value='Update' />
                           <% } %>
                           </asp:Content>


31
Unit Tests inASP.Net MVC
• Form part of the “Test Driven
  Development” philosophy
• Integration with VS 2008




32
Unit Test- Example
• Function marked with[TestMethod]
• Controller instantiated as a “normal” object
• Tests implemented with Assert statement
[TestMethod]
       public void IndexViewTest()
       {
           CategoryController controller = new CategoryController();
           ViewResult result = (ViewResult)controller.Index();
           Assert.AreEqual(result.ViewName, quot;Indexquot;);

           }

 • There are frameworks for tests
     • Moq http://code.google.com/p/moq/
     • The idea is to create a “mirror” (Mock) object and manipulate
       its properties and data returned from functions
     CategoryController controller = new CategoryController();

       Mock<ControllerContext> ctx = new Mock<ControllerContext>();
       ctx.Setup(c => c.HttpContext.Request.HttpMethod).Returns(quot;POSTquot;);
       controller.ControllerContext=ctx.Object;




33
DEMO
References
• ASP.NET Model-View-Controller Applications
  http://quickstarts.asp.net/previews/mvc/default.htm
• ASP.Net Routing http://msdn.microsoft.com/en-us/library/cc668201.aspx
• MVC Tutorials http://www.asp.net/learn/mvc/
• Building Web Apps without Web Forms http://msdn.microsoft.com/en-
  us/magazine/cc337884.aspx
• ASP.NET MVC 1.0 Release Candidate Now Available
  http://weblogs.asp.net/scottgu/archive/2009/01/27/asp-net-mvc-1-0-release-
  candidate-now-available.aspx




35

More Related Content

What's hot

ASP.NET Overview - Alvin Lau
ASP.NET Overview - Alvin LauASP.NET Overview - Alvin Lau
ASP.NET Overview - Alvin LauSpiffy
 
ASP.NET MVC 4 Request Pipeline Internals
ASP.NET MVC 4 Request Pipeline InternalsASP.NET MVC 4 Request Pipeline Internals
ASP.NET MVC 4 Request Pipeline InternalsLukasz Lysik
 
Building Modern Websites with ASP.NET by Rachel Appel
Building Modern Websites with ASP.NET by Rachel AppelBuilding Modern Websites with ASP.NET by Rachel Appel
Building Modern Websites with ASP.NET by Rachel Appel.NET Conf UY
 
Building Real Time Applications with ASP.NET SignalR 2.0 by Rachel Appel
Building Real Time Applications with ASP.NET SignalR 2.0 by Rachel AppelBuilding Real Time Applications with ASP.NET SignalR 2.0 by Rachel Appel
Building Real Time Applications with ASP.NET SignalR 2.0 by Rachel Appel.NET Conf UY
 
Asp.net server controls
Asp.net server controlsAsp.net server controls
Asp.net server controlsRaed Aldahdooh
 
Asp 1-mvc introduction
Asp 1-mvc introductionAsp 1-mvc introduction
Asp 1-mvc introductionFajar Baskoro
 
All About Asp Net 4 0 Hosam Kamel
All About Asp Net 4 0  Hosam KamelAll About Asp Net 4 0  Hosam Kamel
All About Asp Net 4 0 Hosam KamelHosam Kamel
 
Simple mvc4 prepared by gigin krishnan
Simple mvc4 prepared by gigin krishnanSimple mvc4 prepared by gigin krishnan
Simple mvc4 prepared by gigin krishnanGigin Krishnan
 
Tutorial, Part 4: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 4: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...Tutorial, Part 4: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 4: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...SPTechCon
 
Advanced SharePoint Web Part Development
Advanced SharePoint Web Part DevelopmentAdvanced SharePoint Web Part Development
Advanced SharePoint Web Part DevelopmentRob Windsor
 
Discuss About ASP.NET MVC 6 and ASP.NET MVC 5
Discuss About ASP.NET MVC 6 and ASP.NET MVC 5Discuss About ASP.NET MVC 6 and ASP.NET MVC 5
Discuss About ASP.NET MVC 6 and ASP.NET MVC 5Aaron Jacobson
 
ASP.NET MVC 2.0
ASP.NET MVC 2.0ASP.NET MVC 2.0
ASP.NET MVC 2.0Buu Nguyen
 
SharePoint 2010 Application Development Overview
SharePoint 2010 Application Development OverviewSharePoint 2010 Application Development Overview
SharePoint 2010 Application Development OverviewRob Windsor
 
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...SPTechCon
 
Toms introtospring mvc
Toms introtospring mvcToms introtospring mvc
Toms introtospring mvcGuo Albert
 
ASP.Net 5 and C# 6
ASP.Net 5 and C# 6ASP.Net 5 and C# 6
ASP.Net 5 and C# 6Andy Butland
 
Integrating SharePoint 2010 and Visual Studio Lightswitch
Integrating SharePoint 2010 and Visual Studio LightswitchIntegrating SharePoint 2010 and Visual Studio Lightswitch
Integrating SharePoint 2010 and Visual Studio LightswitchRob Windsor
 
Lyudmila Zharova: Developing Solutions for SharePoint 2010 Using the Client O...
Lyudmila Zharova: Developing Solutions for SharePoint 2010 Using the Client O...Lyudmila Zharova: Developing Solutions for SharePoint 2010 Using the Client O...
Lyudmila Zharova: Developing Solutions for SharePoint 2010 Using the Client O...SharePoint Saturday NY
 
Creating Modular Test-Driven SPAs with Spring and AngularJS
Creating Modular Test-Driven SPAs with Spring and AngularJSCreating Modular Test-Driven SPAs with Spring and AngularJS
Creating Modular Test-Driven SPAs with Spring and AngularJSGunnar Hillert
 

What's hot (20)

ASP.NET Overview - Alvin Lau
ASP.NET Overview - Alvin LauASP.NET Overview - Alvin Lau
ASP.NET Overview - Alvin Lau
 
ASP.NET MVC 4 Request Pipeline Internals
ASP.NET MVC 4 Request Pipeline InternalsASP.NET MVC 4 Request Pipeline Internals
ASP.NET MVC 4 Request Pipeline Internals
 
Building Modern Websites with ASP.NET by Rachel Appel
Building Modern Websites with ASP.NET by Rachel AppelBuilding Modern Websites with ASP.NET by Rachel Appel
Building Modern Websites with ASP.NET by Rachel Appel
 
Building Real Time Applications with ASP.NET SignalR 2.0 by Rachel Appel
Building Real Time Applications with ASP.NET SignalR 2.0 by Rachel AppelBuilding Real Time Applications with ASP.NET SignalR 2.0 by Rachel Appel
Building Real Time Applications with ASP.NET SignalR 2.0 by Rachel Appel
 
Asp.net server controls
Asp.net server controlsAsp.net server controls
Asp.net server controls
 
Asp 1-mvc introduction
Asp 1-mvc introductionAsp 1-mvc introduction
Asp 1-mvc introduction
 
All About Asp Net 4 0 Hosam Kamel
All About Asp Net 4 0  Hosam KamelAll About Asp Net 4 0  Hosam Kamel
All About Asp Net 4 0 Hosam Kamel
 
Simple mvc4 prepared by gigin krishnan
Simple mvc4 prepared by gigin krishnanSimple mvc4 prepared by gigin krishnan
Simple mvc4 prepared by gigin krishnan
 
Tutorial, Part 4: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 4: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...Tutorial, Part 4: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 4: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
 
ASP .NET MVC - best practices
ASP .NET MVC - best practicesASP .NET MVC - best practices
ASP .NET MVC - best practices
 
Advanced SharePoint Web Part Development
Advanced SharePoint Web Part DevelopmentAdvanced SharePoint Web Part Development
Advanced SharePoint Web Part Development
 
Discuss About ASP.NET MVC 6 and ASP.NET MVC 5
Discuss About ASP.NET MVC 6 and ASP.NET MVC 5Discuss About ASP.NET MVC 6 and ASP.NET MVC 5
Discuss About ASP.NET MVC 6 and ASP.NET MVC 5
 
ASP.NET MVC 2.0
ASP.NET MVC 2.0ASP.NET MVC 2.0
ASP.NET MVC 2.0
 
SharePoint 2010 Application Development Overview
SharePoint 2010 Application Development OverviewSharePoint 2010 Application Development Overview
SharePoint 2010 Application Development Overview
 
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...
Advanced SharePoint 2010 and 2013 Web Part Development by Rob Windsor - SPTec...
 
Toms introtospring mvc
Toms introtospring mvcToms introtospring mvc
Toms introtospring mvc
 
ASP.Net 5 and C# 6
ASP.Net 5 and C# 6ASP.Net 5 and C# 6
ASP.Net 5 and C# 6
 
Integrating SharePoint 2010 and Visual Studio Lightswitch
Integrating SharePoint 2010 and Visual Studio LightswitchIntegrating SharePoint 2010 and Visual Studio Lightswitch
Integrating SharePoint 2010 and Visual Studio Lightswitch
 
Lyudmila Zharova: Developing Solutions for SharePoint 2010 Using the Client O...
Lyudmila Zharova: Developing Solutions for SharePoint 2010 Using the Client O...Lyudmila Zharova: Developing Solutions for SharePoint 2010 Using the Client O...
Lyudmila Zharova: Developing Solutions for SharePoint 2010 Using the Client O...
 
Creating Modular Test-Driven SPAs with Spring and AngularJS
Creating Modular Test-Driven SPAs with Spring and AngularJSCreating Modular Test-Driven SPAs with Spring and AngularJS
Creating Modular Test-Driven SPAs with Spring and AngularJS
 

Viewers also liked

ASP.NET MVC Performance
ASP.NET MVC PerformanceASP.NET MVC Performance
ASP.NET MVC Performancerudib
 
ASP.NET MVC Presentation
ASP.NET MVC PresentationASP.NET MVC Presentation
ASP.NET MVC Presentationivpol
 
Swaip producten
Swaip productenSwaip producten
Swaip productenVRmaster
 
Mad Skills
Mad SkillsMad Skills
Mad Skillsstandura
 
The Smartphone Challenge (a European perspective)
The Smartphone Challenge (a European perspective)The Smartphone Challenge (a European perspective)
The Smartphone Challenge (a European perspective)Dr. Kim (Kyllesbech Larsen)
 
Due Diligence: How Buyers Can Protect Themselves in Purchasing a Company
Due Diligence:  How Buyers Can Protect Themselves in Purchasing a CompanyDue Diligence:  How Buyers Can Protect Themselves in Purchasing a Company
Due Diligence: How Buyers Can Protect Themselves in Purchasing a CompanyP. Haans Mulder, JD, MST, CFP®
 
Unlv Metacognitive Skills
Unlv Metacognitive SkillsUnlv Metacognitive Skills
Unlv Metacognitive Skillsstandura
 
XI Workshop Genética PUC-GO - Rinaldo Pereira
XI Workshop Genética PUC-GO - Rinaldo PereiraXI Workshop Genética PUC-GO - Rinaldo Pereira
XI Workshop Genética PUC-GO - Rinaldo PereiraRinaldo Pereira
 
Due Diligence: How Buyers Can Protect Themselves in Purchasing a Company
Due Diligence:  How Buyers Can Protect Themselves in Purchasing a CompanyDue Diligence:  How Buyers Can Protect Themselves in Purchasing a Company
Due Diligence: How Buyers Can Protect Themselves in Purchasing a CompanyP. Haans Mulder, JD, MST, CFP®
 
Redesigning Hr
Redesigning HrRedesigning Hr
Redesigning Hrachaudhu
 
Thinking Out Of The Box
Thinking Out Of The BoxThinking Out Of The Box
Thinking Out Of The BoxBarkha_Sharma
 
Estate and Medicand Planning Issues for Widowed Persons
Estate and Medicand Planning Issues for Widowed Persons Estate and Medicand Planning Issues for Widowed Persons
Estate and Medicand Planning Issues for Widowed Persons P. Haans Mulder, JD, MST, CFP®
 
VRmaster pecha kucha
VRmaster pecha kuchaVRmaster pecha kucha
VRmaster pecha kuchaVRmaster
 
Week 2 Chapter 17 - Decisions
Week 2 Chapter 17 - DecisionsWeek 2 Chapter 17 - Decisions
Week 2 Chapter 17 - Decisionswayneholly
 
Proevenaancreativiteit6cs
Proevenaancreativiteit6csProevenaancreativiteit6cs
Proevenaancreativiteit6csVRmaster
 
Fair Shopping Route Den Haag
Fair Shopping Route Den HaagFair Shopping Route Den Haag
Fair Shopping Route Den HaagVRmaster
 

Viewers also liked (20)

ASP.NET MVC 3
ASP.NET MVC 3ASP.NET MVC 3
ASP.NET MVC 3
 
ASP.NET MVC Performance
ASP.NET MVC PerformanceASP.NET MVC Performance
ASP.NET MVC Performance
 
ASP.NET MVC Presentation
ASP.NET MVC PresentationASP.NET MVC Presentation
ASP.NET MVC Presentation
 
Swaip producten
Swaip productenSwaip producten
Swaip producten
 
Pp Mappe 3
Pp Mappe 3Pp Mappe 3
Pp Mappe 3
 
Mad Skills
Mad SkillsMad Skills
Mad Skills
 
The Smartphone Challenge (a European perspective)
The Smartphone Challenge (a European perspective)The Smartphone Challenge (a European perspective)
The Smartphone Challenge (a European perspective)
 
Due Diligence: How Buyers Can Protect Themselves in Purchasing a Company
Due Diligence:  How Buyers Can Protect Themselves in Purchasing a CompanyDue Diligence:  How Buyers Can Protect Themselves in Purchasing a Company
Due Diligence: How Buyers Can Protect Themselves in Purchasing a Company
 
Unlv Metacognitive Skills
Unlv Metacognitive SkillsUnlv Metacognitive Skills
Unlv Metacognitive Skills
 
XI Workshop Genética PUC-GO - Rinaldo Pereira
XI Workshop Genética PUC-GO - Rinaldo PereiraXI Workshop Genética PUC-GO - Rinaldo Pereira
XI Workshop Genética PUC-GO - Rinaldo Pereira
 
Presentation on Managing the Cost of Nursing Home Care
Presentation on Managing the Cost of Nursing Home CarePresentation on Managing the Cost of Nursing Home Care
Presentation on Managing the Cost of Nursing Home Care
 
Due Diligence: How Buyers Can Protect Themselves in Purchasing a Company
Due Diligence:  How Buyers Can Protect Themselves in Purchasing a CompanyDue Diligence:  How Buyers Can Protect Themselves in Purchasing a Company
Due Diligence: How Buyers Can Protect Themselves in Purchasing a Company
 
Redesigning Hr
Redesigning HrRedesigning Hr
Redesigning Hr
 
Thinking Out Of The Box
Thinking Out Of The BoxThinking Out Of The Box
Thinking Out Of The Box
 
Estate and Medicand Planning Issues for Widowed Persons
Estate and Medicand Planning Issues for Widowed Persons Estate and Medicand Planning Issues for Widowed Persons
Estate and Medicand Planning Issues for Widowed Persons
 
VRmaster pecha kucha
VRmaster pecha kuchaVRmaster pecha kucha
VRmaster pecha kucha
 
Week 2 Chapter 17 - Decisions
Week 2 Chapter 17 - DecisionsWeek 2 Chapter 17 - Decisions
Week 2 Chapter 17 - Decisions
 
Proevenaancreativiteit6cs
Proevenaancreativiteit6csProevenaancreativiteit6cs
Proevenaancreativiteit6cs
 
Agt planning methodology
Agt planning methodologyAgt planning methodology
Agt planning methodology
 
Fair Shopping Route Den Haag
Fair Shopping Route Den HaagFair Shopping Route Den Haag
Fair Shopping Route Den Haag
 

Similar to Introduction to ASP 3.5 SP1 MVC 1.0

CTTDNUG ASP.NET MVC
CTTDNUG ASP.NET MVCCTTDNUG ASP.NET MVC
CTTDNUG ASP.NET MVCBarry Gervin
 
ASP.NET MVC introduction
ASP.NET MVC introductionASP.NET MVC introduction
ASP.NET MVC introductionTomi Juhola
 
Developing ASP.NET Applications Using the Model View Controller Pattern
Developing ASP.NET Applications Using the Model View Controller PatternDeveloping ASP.NET Applications Using the Model View Controller Pattern
Developing ASP.NET Applications Using the Model View Controller Patterngoodfriday
 
Asp.Net MVC Framework Design Pattern
Asp.Net MVC Framework Design PatternAsp.Net MVC Framework Design Pattern
Asp.Net MVC Framework Design Patternmaddinapudi
 
Introduction To Mvc
Introduction To MvcIntroduction To Mvc
Introduction To MvcVolkan Uzun
 
Controllers & actions
Controllers & actionsControllers & actions
Controllers & actionsEyal Vardi
 
Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5Tuna Tore
 
springmvc-150923124312-lva1-app6892
springmvc-150923124312-lva1-app6892springmvc-150923124312-lva1-app6892
springmvc-150923124312-lva1-app6892Tuna Tore
 
Introduction to Struts 1.3
Introduction to Struts 1.3Introduction to Struts 1.3
Introduction to Struts 1.3Ilio Catallo
 
Spring 3.x - Spring MVC
Spring 3.x - Spring MVCSpring 3.x - Spring MVC
Spring 3.x - Spring MVCGuy Nir
 
SoftServe - "ASP.NET MVC як наступний крок у розвитку технології розробки Web...
SoftServe - "ASP.NET MVC як наступний крок у розвитку технології розробки Web...SoftServe - "ASP.NET MVC як наступний крок у розвитку технології розробки Web...
SoftServe - "ASP.NET MVC як наступний крок у розвитку технології розробки Web...SoftServe
 
ASP.NET - Building Web Application..in the right way!
ASP.NET - Building Web Application..in the right way!ASP.NET - Building Web Application..in the right way!
ASP.NET - Building Web Application..in the right way!Commit Software Sh.p.k.
 
MVC & SQL_In_1_Hour
MVC & SQL_In_1_HourMVC & SQL_In_1_Hour
MVC & SQL_In_1_HourDilip Patel
 
ASP.NET MVC Fundamental
ASP.NET MVC FundamentalASP.NET MVC Fundamental
ASP.NET MVC Fundamentalldcphuc
 
ASP.net MVC Introduction Wikilogia (nov 2014)
ASP.net MVC Introduction Wikilogia (nov 2014)ASP.net MVC Introduction Wikilogia (nov 2014)
ASP.net MVC Introduction Wikilogia (nov 2014)Hatem Hamad
 
Introduction to ASP.NET MVC
Introduction to ASP.NET MVCIntroduction to ASP.NET MVC
Introduction to ASP.NET MVCMaarten Balliauw
 
What's Coming in Spring 3.0
What's Coming in Spring 3.0What's Coming in Spring 3.0
What's Coming in Spring 3.0Matt Raible
 

Similar to Introduction to ASP 3.5 SP1 MVC 1.0 (20)

CTTDNUG ASP.NET MVC
CTTDNUG ASP.NET MVCCTTDNUG ASP.NET MVC
CTTDNUG ASP.NET MVC
 
ASP.NET MVC introduction
ASP.NET MVC introductionASP.NET MVC introduction
ASP.NET MVC introduction
 
Developing ASP.NET Applications Using the Model View Controller Pattern
Developing ASP.NET Applications Using the Model View Controller PatternDeveloping ASP.NET Applications Using the Model View Controller Pattern
Developing ASP.NET Applications Using the Model View Controller Pattern
 
Asp.Net MVC Framework Design Pattern
Asp.Net MVC Framework Design PatternAsp.Net MVC Framework Design Pattern
Asp.Net MVC Framework Design Pattern
 
Introduction To Mvc
Introduction To MvcIntroduction To Mvc
Introduction To Mvc
 
Controllers & actions
Controllers & actionsControllers & actions
Controllers & actions
 
ASP .net MVC
ASP .net MVCASP .net MVC
ASP .net MVC
 
Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5
 
springmvc-150923124312-lva1-app6892
springmvc-150923124312-lva1-app6892springmvc-150923124312-lva1-app6892
springmvc-150923124312-lva1-app6892
 
Introduction to Struts 1.3
Introduction to Struts 1.3Introduction to Struts 1.3
Introduction to Struts 1.3
 
Spring 3.x - Spring MVC
Spring 3.x - Spring MVCSpring 3.x - Spring MVC
Spring 3.x - Spring MVC
 
SoftServe - "ASP.NET MVC як наступний крок у розвитку технології розробки Web...
SoftServe - "ASP.NET MVC як наступний крок у розвитку технології розробки Web...SoftServe - "ASP.NET MVC як наступний крок у розвитку технології розробки Web...
SoftServe - "ASP.NET MVC як наступний крок у розвитку технології розробки Web...
 
Asp.Net MVC Intro
Asp.Net MVC IntroAsp.Net MVC Intro
Asp.Net MVC Intro
 
ASP.NET - Building Web Application..in the right way!
ASP.NET - Building Web Application..in the right way!ASP.NET - Building Web Application..in the right way!
ASP.NET - Building Web Application..in the right way!
 
MVC & SQL_In_1_Hour
MVC & SQL_In_1_HourMVC & SQL_In_1_Hour
MVC & SQL_In_1_Hour
 
ASP.NET MVC Fundamental
ASP.NET MVC FundamentalASP.NET MVC Fundamental
ASP.NET MVC Fundamental
 
ASP.net MVC Introduction Wikilogia (nov 2014)
ASP.net MVC Introduction Wikilogia (nov 2014)ASP.net MVC Introduction Wikilogia (nov 2014)
ASP.net MVC Introduction Wikilogia (nov 2014)
 
Introduction to ASP.NET MVC
Introduction to ASP.NET MVCIntroduction to ASP.NET MVC
Introduction to ASP.NET MVC
 
Asp.net mvc
Asp.net mvcAsp.net mvc
Asp.net mvc
 
What's Coming in Spring 3.0
What's Coming in Spring 3.0What's Coming in Spring 3.0
What's Coming in Spring 3.0
 

Recently uploaded

Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentationphoebematthew05
 
Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024Neo4j
 

Recently uploaded (20)

Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentation
 
Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024Build your next Gen AI Breakthrough - April 2024
Build your next Gen AI Breakthrough - April 2024
 

Introduction to ASP 3.5 SP1 MVC 1.0

  • 1. Introduction to ASP 3.5 SP1 Model, View, Controller (MVC 1.0 RTM) Michał Morciniec micham @microsoft.com GPSD, Microsoft Spain 24 March2009
  • 2. Agenda • ASP.Net MVC Architecture – Comparación con ASP.Net (“Web Forms”) • URL Routing and its use by MVC • MVC Components – Model – Controller • Actions and their parameters – Views • Data passing to Views • HTML Helpers • Partial Views(ViewUserControl) • Form Processing by actions – ModelBinder, ModelState, UpdateModel – Data Validation • Unit Tests in ASP.Net MVC • Demo 2
  • 3. Environment • Microsoft .NET Framework 3.5 Service Pack 1 -recomendado • http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID= ab99342f-5d1a-413d-8319-81da479ab0d7 • Microsoft Visual Studio 2008 Service Pack 1 (Installer) - recomendado • http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID= fbee1648-7106-44a7-9649-6d9f6d58056e • ASP.NET MVC 1.0 (RTM) • http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce- 43bf-b6a6-35e00103cb4b&displaylang=en • Copies System.Web.Mvc.dll to GAC and folder %ProgramFilesMicrosoft ASP.NETASP.NET MVC 1.0 Assemblies • VS 2008 Professional Edition required for unit tests 3
  • 4. MVC as an Architectural Pattern Pattern involving three components • An alternative to ASP.Net Forms • Leverages ASP.Net functionality Object mainaining • application state “Lives” in System.Web.Mvc • Model Components for data View Controller visualization Components that process user Interaction, consult Model and present a view 4
  • 5. Comparing MVC with ASP.Net Web Forms • MVC Advantages – Better complexity management (separation) – Developer has a total control over application – Complex routing scenarios possible – Better support for Test-Driven-Development – Works well in large teams of developers and designers • ASP.Net Web Forms Advantages – Event based model maintains the state over HTTP requests – Server generates pages and maintains the state – Works well for small developer teams – Reduces development complexity (server processes controls) 5
  • 6. ASP.Net Functionality compatible with MVC In-line Expressions <%= %> • Master Pages (nested) • Localization • Data-Binding • Templating • URL Autorization • Forms Authentication • Membership and Roles • Provider Architecture • Output and Data Caching • Session and Profile State Management • Health Monitoring • Configuration System • 6
  • 7. ASP.Net Functionality not used by MVC • Postbacks (all interactions are handled by Controller) – View State, – Lifecycle events of the ASP.Net Web Page 7
  • 8. Examples of Sites using ASP.Net MVC • http://www.stackoverflow.com – Receives more than 300K visits a day –more detail in http://channel9.msdn.com/pdc2008/PC21/ http://www.cruvee.com/ • http://www.ideavine.net/ • http://www.theloungenet.com/ • http://www.retaggr.com/ • http://www.visitmix.com/ • 8
  • 9. URL Routing • “classic” ASP.Net (with no URL Routing) – URL identifies physical resource in server http://server/application/Products.aspx?id=4 • ASP.Net MVC uses URL Routing (introduced in .Net 3.5) – URL does not identify physical resource – URL is parsed according to Route Definition http://server/application/Products/List/drinks Matching URL {controller}{action}{id} Route Definition 9
  • 10. URL Routes Definition (in General) • Route object is added to routing table in Global.asax • Constructor accepts: – URL Route Definition pattern – Route handler instance (implements System.Web.Routing.IRouteHandler) protected void Application_Start(object sender, EventArgs e) { RegisterRoutes(RouteTable.Routes); } public static void RegisterRoutes(RouteCollection routes) { routes.Add(new Route ( quot;Category/{action}/{categoryName}quot; , new CategoryRouteHandler() )); } 10
  • 11. URL Routing in MVC • ASP.Net MVC uses ASP.Net Routing to: – Map URLs to Controllers and Actions – ASP.Net Routing parses URL query strings and passes them as action parameters in Controllers – Function MapRoutes adds MVC route – Function IgnoreRoutes excludes route from MVC processing public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute(quot;{resource}.axd/{*pathInfo}quot;); routes.MapRoute( quot;Defaultquot;, quot;{controller}/{action}/{id}quot;, new { controller = quot;Homequot;, action = quot;Indexquot;, id = quot;quot; } ); } 11
  • 12. MVC - Model Model • Objects that maintain application state • Interact with repository (database) • Controller creates them in Actions and passes them to Views • View accesses data in the Object • Examples: DataSet, DataReader, LINQ to SQL, etc. • Model calses are stored in Models directory (or other assembly) 12
  • 13. MVC - Controller • Class with“Controller” suffix Controller – Actions are public methods – Implement business logic – View() function passes model object to View • Controller exposes – Request y Response objects (accessible in actions) – They correstpond to HttpRequest and HttpResponse [HandleError] public class HomeController : Controller { public ActionResult Index() { ViewData[quot;Titlequot;] = quot;Home Pagequot;; ViewData[quot;Messagequot;] = quot;Welcome to ASP.NET MVC!quot;; return View(); } } 13
  • 14. Controller Creation in VS 2008 SP1 • Can generate Actions to: – Create – Edit – Show Detail of the entity // GET: /Test/Edit/ public ActionResult Edit(int id) { return View(); } // POST: /Test/Edit/5 [AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(int id, FormCollection collection) { try { // TODO: Add update logic here return RedirectToAction(quot;Indexquot;); } catch { return View(); } } 14
  • 15. MVC – Controller Actions • Actions correspond to user interactions – URL entered in browser – Html Link clicked – Form posted, etc. • Modeled as a public Controller method – Returns ActionResult – Attribute[NonAction] excludes method from MVC processing Método Típo de ActionResult View() ViewResult RedirectToAction() RedirectToRouteResult RedirectToRoute() Redirect() RedirectResult Json() JsonResult Content() ContentResult Acción “sin resultado” EmptyResult 15
  • 16. MVC – Controller Action Parameters • Action parameters are derived from Http Request object – Form data (name-value) – “URL Query string values” – “Cookie values” • Parameter mapping is automatic: – For route {controller}/{action}/{id} • URL Query string values /Products/Detail?id=5 • Or URL suffix /Products/Detail/5 • Gives us parameter id=5 public ActionResult • Parameter support Nullable ShowArticles(DateTime? date) { public ResultAction Detail(int id) if (!date.HasValue) { { date = DateTime.Now; ViewData[quot;DetailInfoquot;] = id; } return View(quot;Detailquot;); } } 16
  • 17. Action Attributes [AcceptVerbs] and [ActionName] • [AcceptVerbs] allows to use same URL for GET and POST – /Products/InsertCategory [AcceptVerbs( HttpVerbs.Get)] public ActionResult InsertCategory () { // muestra vista con formulario vacío } [AcceptVerbs( HttpVerbs.Post)] public ActionResult InsertCategory (Category category) { // procesa formulario y guarda objeto } • [ActionName ] allows to have name of action different from function name [ActionName=“InsertCategory”,AcceptVerbs(HttpVerbs.Post)] public ActionResult SaveCategory (Category category) { // procesa formulario y guarda objeto } 17
  • 18. MVC - View View • An instance of System.Web.MVC.ViewPage, – Implements IViewDataContainer – Property ViewData.Model contains model object if passed from controller • View pages are stored according to pattern: – Views/{controller}/{view}.aspx Category.aspx <%@ Page Title=“Categoryquot; Language=quot;C#quot; MasterPageFile=quot;~/Views/Shared/Site.Masterquot; AutoEventWireup=quot;truequot; CodeBehind=quot;Category.aspx.csquot; Inherits=quot;NorthwindMVC.Views.Products.Categoryquot; %> • Views (property Model) can be “strongly typed” Category.aspx.cs public partial class Category : ViewPage<NorthwindMVC.Models.Category> • In RC1 “code behind” for Views has been eliminated – to facilitate IntelliSence 18
  • 19. MVC– View Creation in VS2008 (MVC RC1) • CTRL+M, CTRL+V • Allows to – Specify master page – Specify view type – Create partial view – Generate view implementation for Create, Edit, Details and List operations 19
  • 20. MVC– Passing Data to “loosely typed” View • Controller passes data to Views in actions ProductsController.cs • ViewData.Model contains public ActionResult Categories() { List<Category> categories = model object passed to View() northwind.GetCategories(); • In “loosely typed” Views: return View(“Indexquot;, categories); } – Explicit type conversion is required Nombre de Vista Datos Index.aspx <%@ Page …%> <asp:Content ID=quot;Content1quot; …> <%@ Import Namespace=quot;NorthwindMVC.Modelsquot; %> <% List<Category> cat = ViewData.Model as List<Category>; Response.Write(quot;View Data has quot; + cat.Count+ quot; objects.quot;); %> </asp:Content> Index.aspx.cs public partial class Index : ViewPage {} 20
  • 21. MVC– Passing Data to “strongly typed” View • In “strongly typed” Views: ProductsController.cs – ViewData.Model is of assigned type public ActionResult ShowCategory(int id){ db = GetDbContext(); Category cat = (from c in db.Categories where c.CategoryID == id select c).Single(); return View(quot;Categoryquot;, cat); } Category.aspx <%@ Page …%> <asp:Content ID=quot;Content1quot; …> … <td><%=ViewData.Model.CategoryName%></td> <td><%=ViewData.Model.Description %></td> … </asp:Content> Category.aspx.cs public partial class Index : ViewPage<NortwindMVC.Models.Category> {} 21
  • 22. MVC– Passing Data to View using ViewData • Controller passes data using HomeController.cs ViewDataDictionary public ActionResult Index(){ ViewData[quot;Titlequot;] = quot;Home Pagequot;; • In Views this dictionary is ViewData[quot;Messagequot;] = quot;Welcome to accessible through ViewData ASP.NET MVC!quot;; return View();} Index.aspx <%@ Page …%> <asp:Content ID=quot;Content1quot; …> … <h2><%= Html.Encode(ViewData[quot;Messagequot;]) %></h2> </asp:Content> 22
  • 23. MVC– View Gerneration using HTML Helpers • Classes that emit HTML controls – Examples: CheckBox, RadioButton, ListBox, TextBox ,etc. Helper Type Function Example of Use Explanation Html.ActionLink Link to action Executes action <%= Html.ActionLink(quot;Editquot;, quot;EditCategoryquot;, new { id = EditCategory passing id c.CategoryID})%> as parameter Html.BeginForm Marks beginning of a From will be processed by <% using (Html.BeginForm(quot;InsertCatego form points to action that InsertCategory action of ryquot;, quot;Productsquot;)) will process form. ProductsController { %> Html.ValidationSummary Summary of validation Shows error summary <%=Html.ValidationSummary() %> errors that ModelState contains Html.ValidationMessage Specifies validatoin error Shows * besinde invalid <%=Html.ValidationMessage(quot;De scriptionquot;,quot;*quot;) %> message form field Html.Hidden Embeds invisible Action can access <%= Html.Hidden(Category.Category information CategoryID parameter IDKey, ViewData.Model.CategoryID) %> 23
  • 24. MVC– Partial Views (ViewUserControl) • MVC ViewUserControl can encapsulate HTML fragment in a component • Can be “strongly typed” – ViewData.Model will be of the type assigned CategoryTemplate.aspx CategoryTemplate.aspx.cs <%@ Control …quot; %> <tr> public partial class CategoryTemplate : <td><%= ViewData.Model.CategoryName%></td> System.Web.Mvc.ViewUserControl <td><%= ViewData.Model.Description%></td> <NorthwindMVC.Models.Category> {} <td><%= Html.ActionLink(quot;Deletequot;, quot;DeleteCategoryquot;, new { id = ViewData.Model.CategoryID})%> <%= Html.ActionLink(quot;Editquot;, quot;EditCategoryquot;, new { id = ViewData.Model.CategoryID})%></td> </tr> 24
  • 25. MVC– Partial View (ViewUserControl) • Html.RenderPartial helper injects the HTML into ListCategories.aspx a View <%@ Page …%> <%@ Import Namespace=quot;NorthwindMVC.Modelsquot; %> • Note the use of <% %> <asp:Content…> <table> <tr> <th>Category Name</th> <th>Category Description</th> <th>Actions</th> </tr> <% foreach (Category c in ViewData.Model) { %> <% Html.RenderPartial(quot;CategoryTemplatequot;, c);%> <% } %> </table> </asp:Content> CategoryTemplate.aspx CategoryTemplate.aspx.cs <%@ Control …quot; %> <tr> public partial class CategoryTemplate : <td><%= ViewData.Model.CategoryName%></td> System.Web.Mvc.ViewUserControl <td><%= ViewData.Model.Description%></td> <NorthwindMVC.Models.Category> {} <td><%= Html.ActionLink(quot;Deletequot;, quot;DeleteCategoryquot;, new { id = ViewData.Model.CategoryID})%> <%= Html.ActionLink(quot;Editquot;, quot;EditCategoryquot;, new { id = ViewData.Model.CategoryID})%></td> </tr> 25
  • 26. Model Binders • MVC uses DefaultModelBinder • ModelBinder de-serializes object from HTTP stream – Looks for form fields according to convention: {action parameter}.{class property} public class Category{ public string CategoryId { get; set; } Model public string CategoryName { get; set; } public string Description{ get; set; } } <textarea cols=quot;20quot; id=“category.Descriptionquot; name=quot;Descriptionquot; rows=quot;2quot;> tools for gardening View </textarea> [AcceptVerbs( HttpVerbs.Post)] Controller public ActionResult InsertCategory (Category category){ } • Convention and inclusion of form fields can be controlled with [Bind] [AcceptVerbs( HttpVerbs.Post)] public ActionResult InsertCategory ([Bind(Prefix=quot;NewCategoryquot;,Include=quot;CategoryName,Descriptionquot;)] Category category){ } 26
  • 27. From Processing –Edit (GET) http://localhost/Products/EditCategory/12 ProductsController.aspx [AcceptVerbs(HttpVerbs.Get)] public ActionResult EditCategory(int id){ Category category = db.Categories.Single<Category>(c => c.CategoryID == id); return View(quot;EditCategoryquot;, category); } EditCategory.aspx <asp:Content …> <%=Html.ValidationSummary() %> <% using (Html.BeginForm()) { %> <%= Html.Hidden(Category.CategoryIDKey,ViewData.Model.CategoryID) %> <div> Category Name: <%= Html.TextBox(Category.CategoryNameKey, ViewData.Model.CategoryName)%> <%=Html.ValidationMessage(quot;CategoryNamequot;,quot;*quot;) %> … <input type=quot;submitquot; title=quot;Updatequot; value='Update' /> <% } %> </asp:Content> 27
  • 28. Form Processing – Edit (POST) •NewCategory.CategoryId + FormCollection •NewCategory.CategoryName http://localhost/Products/EditCategory/12 •NewCategory.CategoryDescription [AcceptVerbs(HttpVerbs.Post)] public ActionResult EditCategory(int id, FormCollection form) { Category category = db.Categories.Single<Category>(c => c.CategoryID == id); try{ UpdateModel<NorthwindMVC.Models.Category>(category, quot;NewCategoryquot;, new[] { quot;CategoryNamequot;, quot;Descriptionquot; }); category.Validate(ViewData.ModelState); if (ModelState.IsValid){ db.SubmitChanges(); return RedirectToAction(quot;ListCategoriesquot;, new RouteValueDictionary(new { controller = quot;Productsquot;, action = quot;ListCategoriesquot; })); } else return View(quot;EditCategoryquot;, category); } catch { return View(quot;EditCategoryquot;, category); } } UpdateModel() copies matching field values into model object properties 28
  • 29. Form Processing– Create (GET) http://localhost/Products/AddNewCategory ProductsController.aspx [AcceptVerbs(HttpVerbs.Get)] public ActionResult AddNewCategory(Category category) { if (category==null) { category = new Category(){CategoryName=quot;quot;,Description=quot;quot;}; } return View(quot;AddNewCategoryquot;, category); } AddNewCategory.aspx <asp:Content …> <%=Html.ValidationSummary() %> <% using (Html.BeginForm(quot;InsertCategoryquot;, quot;Productsquot;)) { %> <div> Category Name: <%= Html.TextBox(Category.CategoryNameKey, ViewData.Model.CategoryName)%> <%=Html.ValidationMessage(quot;CategoryNamequot;,quot;*quot;) %> </div> … <input type=quot;submitquot; title=quot;Submitquot; value='Submit' /> <input type=quot;submitquot; title=quot;Cancelquot; value='Cancel' /> <% } %> </asp:Content> 29
  • 30. From Processing - Create(POST) •NewCategory.CategoryId + FormCollection •NewCategory.CategoryNameKey http://localhost/Products/InsertCategory •NewCategory.CategoryDescriptionKey [AcceptVerbs( HttpVerbs.Post)] public ActionResult InsertCategory([Bind(Prefix=quot;NewCategoryquot;,Include=quot;CategoryName,Description quot;)] Category category) { category.Validate(ViewData.ModelState); if (ModelState.IsValid){ AddCategoryToDatabase(category); return RedirectToAction(quot;ListCategoriesquot;, new RouteValueDictionary(new { controller = quot;Productsquot;, action = quot;ListCategoriesquot; })); } else{ return View(quot;AddNewCategoryquot;, category); } } • [Bind] specifies form fields to be included 30
  • 31. Data Validation • Typically model object implement IDataErrorInfo and generate validation error messages • Diccionario ViewData.ModelState contains the state of the model validation • ModelState.IsValid() determines if valid or no. EditCategory.aspx <asp:Content …> <%=Html.ValidationSummary() %> <% using (Html.BeginForm()) { %> <%= Html.Hidden(Category.CategoryIDKey,ViewData.Model.CategoryID) %> <div> Category Name: <%= Html.TextBox(Category.CategoryNameKey, ViewData.Model.CategoryName)%> <%=Html.ValidationMessage(quot;CategoryNamequot;,quot;*quot;) %> </div> <div> <div> Description: </div> <%= Html.TextArea(Category.DescriptionKey,ViewData.Model.Description) %> <%=Html.ValidationMessage(quot;Descriptionquot;,quot;*quot;) %> </div> <input type=quot;submitquot; title=quot;Updatequot; value='Update' /> <% } %> </asp:Content> 31
  • 32. Unit Tests inASP.Net MVC • Form part of the “Test Driven Development” philosophy • Integration with VS 2008 32
  • 33. Unit Test- Example • Function marked with[TestMethod] • Controller instantiated as a “normal” object • Tests implemented with Assert statement [TestMethod] public void IndexViewTest() { CategoryController controller = new CategoryController(); ViewResult result = (ViewResult)controller.Index(); Assert.AreEqual(result.ViewName, quot;Indexquot;); } • There are frameworks for tests • Moq http://code.google.com/p/moq/ • The idea is to create a “mirror” (Mock) object and manipulate its properties and data returned from functions CategoryController controller = new CategoryController(); Mock<ControllerContext> ctx = new Mock<ControllerContext>(); ctx.Setup(c => c.HttpContext.Request.HttpMethod).Returns(quot;POSTquot;); controller.ControllerContext=ctx.Object; 33
  • 34. DEMO
  • 35. References • ASP.NET Model-View-Controller Applications http://quickstarts.asp.net/previews/mvc/default.htm • ASP.Net Routing http://msdn.microsoft.com/en-us/library/cc668201.aspx • MVC Tutorials http://www.asp.net/learn/mvc/ • Building Web Apps without Web Forms http://msdn.microsoft.com/en- us/magazine/cc337884.aspx • ASP.NET MVC 1.0 Release Candidate Now Available http://weblogs.asp.net/scottgu/archive/2009/01/27/asp-net-mvc-1-0-release- candidate-now-available.aspx 35