다음 글을 한글로 바꾸었습니다.

Getting Started with ASP.NET Web API 2 (C#)

많이 부족합니다. 참고만 하셔요 ~ ^^

 

ASP.NET Web API 2 시작하기 (C#)

by Mike Wasson

Download Completed Project

HTTP 단순히 web Page 만을 serving 하기 위한 프로토콜이 아닙니다. 서비스와 데이터를 노출하기 위한 API 구축하는데 강력한 Platform 이기도 합니다.

HTTP 간단하고 유연하며 Ubiquitous 합니다. 머리에 떠오르는 거의 모든 Platform 에는 HTTP Library 포함하고 있으므로 HTTP Service 브라우져를 포함한 모바일 기기, 전통적인 데스크탑 어플리케이션에 이르기 까지 광범위한 클라이언트까지 연결할 있습니다.

ASP.NET Web API .NET Framework 기반위에 Web API 구축하기 위한 Framework 입니다., Tutorial 에서는 ASP.NET Web API 사용하여 Product 목록을 반환하는 Web API 생성합니다.

 

Tutorial 에서 사용 된 Software Version

  • Web API 2

 

Web API Project 생성하기

Tutorial 에서 ASP.NET Web API 사용하여 Product 목록을 반환하는 Web API 생성합니다.

Front-end web page 는 jQuery 사용하여 결과를 표시합니다.

 

Visual Studio 시작하고 Start Page 에서 New Project 선택합니다. 또는 File Menu 에서 New 선택하고 Project 선택합니다.

Template 창에서 설치된 Templates 선택하고 Visual C# Node 확장합니다. Visual C# 아래에 Web 선택합니다. Project Template 목록에서 ASP.NET Web Application 선택합니다. Project Name "ProductsApp" 입력하고 OK 클릭합니다.

 

ASP.NET Project 대화상자에서 Empty template( 템플릿) 선택합니다.

"Add folders and core reference for"("폴더 핵심 참조 추가") 하단의 Web API Check 하고 OK 클릭합니다.

[!주목] "Web API" Template 사용하여 Web API Project 생성할 수도 있습니다.. Web API template ASP.NET MVC 사용하여 API Help Page 제공합니다. MVC 없이 Web API 작성하는 모습을 보여주기 위해 Empty template 사용합니다. 일반적으로 Web API 사용하기위해 ASP.NET MVC 알필요는 없습니다.

 

Model 추가하기

Model application 에서 Data 표현하는 객체입니다. ASP.NET Web API model JSON, XML 또는 다른 형식으로 자동적으로 직렬화해줍니다. 그리고 직렬화된 data HTTP Response Message Body 작성합니다. Client 직렬화된 형식을 읽을 있다면 Object Deserialize 있습니다. 대부분의 Client 들은 XML 이나 JSON Parsing 있습니다. 게다가 HTTP request Message Accept header 설정하여 원하는 format  표시하는 것도 가능합니다.

 

그럼, Product 나타내는 간단한 Model 생성하는 부터 시작해 봅시다.

Solution Explorer 아직 보이지 않는다면, View Menu 클릭하여 Solution Explorer 선택하십시오.

 

Models 폴더를 마우스 오른쪽 버튼으로 클릭합니다. 나타난 Context Menu 에서 Add 선택하고 Class 선택합니다.

 

Class Name 으로 "Product" 지정합니다. Product Class 다음 Properties 추가합니다.

namespace ProductsApp.Models
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }
        public decimal Price { get; set; }
    }
}

 

 

Controller 추가하기

Web API 에서 Controller HTTP Request 처리하는 객체입니다. 이제 Product 목록 이나 지정한 ID 단일 Product 정보를 반환하는 Controller 추가합니다.

[!주목] ASP.NET MVC 사용해 본적이 있다면 이미 controller 익숙할 것입니다. Web API Controller MVC Controller 유사하지만 Controller class 대신에 ApiController Class 상속합니다.

 

Solution Explorer 에서  Controller folder 마우스 오른쪽 버튼을 이용하여 클릭합니다. Add 선택한 Controller 선택합니다.

 

Add Scaffold 대화상자에서 Web API Controller - Empty 선택합니다. Add 클릭합니다.

 

Add Controller 대화상자에서 Controller 이름을 ProductsController 지정합니다. Add 클릭합니다.

 

Scaffolding Controller folder ProductsController.cs 라는 이름의 파일을 생성합니다.

[!주목]Controller 파일들을 Controllers 라는 이름의 folder 넣지 않아도 됩니다. Folder 이름은 단지 Source 파일들을 구성하기위한 편리한 방법중 하나입니다.

파일이 아직 열려있지 않다면, 파일을 더블클릭하여 엽니다. 열린 파일의 코드를 다음의 코드로 대체합니다.

using ProductsApp.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web.Http;

namespace ProductsApp.Controllers
{
    public class ProductsController : ApiController
    {
        Product[] products = new Product[]
        {
            new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },
            new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },
            new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }
        };

        public IEnumerable<Product> GetAllProducts()
       
{
            return products;
        }

        public IHttpActionResult GetProduct(int id)
       
{
            var product = products.FirstOrDefault((p) => p.Id == id);
            if (product == null)
            {
                return NotFound();
            }
            return Ok(product);
        }
    }
}

 

예제를 단순하게 유지하기 위해서 Products Controller Class 내부에 고정된 배열로 저장되어 있습니다. 물론 실제 application 에서는 database 다른 외부의 data source 부터 Query 하여 사용합니다.

 

Controller 에서는 Product 반환하는 두가지 Method 정의합니다.

  • GetAllProducts Method 는 Ienumerable<Product> 형식의 Product 전체 목록을 반환합니다.
  • GetProduct Method ID   단일 Product 조회합니다.

 

작동하는 Web API 이게 다입니다. Controller Method 하나 이상의 URL 일치합니다 :

 

Controller Method

URI

GetAllProducts

/api/products

GetProduct

/api/products/id

 

GetProduct Method URL id placeholder 입니다. 얘룰 둘어 ID 5 product 조회하는 URL api/products/5.입니다.

Web API HTTP request Controller method Route하는 방법에 대해서는 Routing in ASP.NET Web API 참조하십시오.

 

javascript jQuery web API 호출하기.

이번에는 Web API 호출하기위해 AJAX 사용하는 HTML page 추가합니다. AJAX 호출을 만들고 반환된 결과로 Page Update  하기 위해서 jQuery 사용합니다.

 

솔루션 탐색기에서 Project 오른쪽 마우스 버튼을 클릭하여 Add 선택하고 New Item 선택합니다.

 

New Item 대화상자에서 Visual C# 포함된 Web node 선택하고 HTML Page item 선택합니다. Page 이름은 "Index.html" 으로 지정합니다.

 

파일의 모든 내용을 다름 내용으로 바꿉니다 : 

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Product App</title>
</head>
<body>

  <div>
    <h2>All Products</h2>
    <ul id="products" />
  </div>
  <div>
    <h2>Search by ID</h2>
    <input type="text" id="prodId" size="5" />
    <input type="button" value="Search" onclick="find();" />
    <p id="product" />
  </div>

  <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script>
  <script>
    var uri = 'api/products';

    $(document).ready(function () {
      // Send an AJAX request
      $.getJSON(uri)
          .done(function (data) {
            // On success, 'data' contains a list of products.
            $.each(data, function (key, item) {
              // Add a list item for the product.
              $('<li>', { text: formatItem(item) }).appendTo($('#products'));
            });
          });
    });

    function formatItem(item) {
      return item.Name + ': $' + item.Price;
    }

    function find() {
      var id = $('#prodId').val();
      $.getJSON(uri + '/' + id)
          .done(function (data) {
            $('#product').text(formatItem(data));
          })
          .fail(function (jqXHR, textStatus, err) {
            $('#product').text('Error: ' + err);
          });
    }
 
</script>
</body>
</html>

 

jQuery 가져오는 방법에는 몇가지방법이 있습니다. 예제에서는 Microsoft Ajax CDN 사용했습니다. http://jquery.com/ 에서도 다운로드 받을수 있으며, ASP.NET "Web API" project template 에도 jQuery 포함되어 있습니다.

 

Product 목록 가져오기

product 목록을 조회해오기 위해서 "/api/products" HTTP GET Request 보냅니다.

jQuery getJSON function AJAX request 보냅니다. response 에는 JSON 객체의 배열이 포함되어 있습니다. done function request 성공했을 호출될 callback 지정합니다. callback 에서 product 정보를 가지고 DOM update 합니다.

$(document).ready(function () {
    // Send an AJAX request
    $.getJSON(apiUrl)
        .done(function (data) {
            // On success, 'data' contains a list of products.
            $.each(data, function (key, item) {
                // Add a list item for the product.
                $('<li>', { text: formatItem(item) }).appendTo($('#products'));
            });
        });
});

 

ID Product 정보 가져오기

ID Product 정보를 가져오기 위해서는 "/api/products/id" HTTP GET request 보냅니다. 여기서 id Product ID 입니다.

function find() {
    var id = $('#prodId').val();
    $.getJSON(apiUrl + '/' + id)
        .done(function (data) {
            $('#product').text(formatItem(data));
        })
        .fail(function (jqXHR, textStatus, err) {
            $('#product').text('Error: ' + err);
        });
}

 

AJAX request 보내기 위해 이전과 동일하게 getJSON 호출합니다. 하지만 이번에는 request URI ID 포함시킵니다. request 부터 전달된 response 단일 Product 표현된 JSON 입니다.

 

Application 실행하기

 

F5 눌러 application debugging 시작합니다. 다음과 같이 web page 보여야 합니다 :

 

ID Project 조회하기 위해서는 ID 입력하고 Search 버튼을 클릭합니다.

 

유효하지 않은 ID 입력하면 server HTTP 오류를 반환합니다.

 

F12 사용하여 HTTP Request Response 내용 보기

HTTP Service 이용하는 작업을 HTTP Request Response Message 확인하는 것은 매우 유용합니다. Internet Explorer 9 F12 개발자도구를 사용하면 작업이 가능하다. Internet Explorer 9 에서 F12 툴러 도구를 엽니다. Network Tab 클릭하고  Start Capturing 누릅니다. 이제 Web page 돌아가서 F5 눌러 Web page 새로고침합니다. Internet Explorer browser web server 간의 traffic capture 합니다. summery page page 에서 일어난  모든 network traffic 보여줍니다.

 

상대경로 URI 중에서 "api/products/" 항목을 찾으십시요. 항목을 선택하고 Go to detail view 클릭합니다. 상세 View request response header body 있는 tab 있습니다. 예를 들어, Request headers Tab 클릭하면 Accept header 속에 client 요청한 "application/json" 확인할 있습니다.

 

Response body tab 클릭하면 product list 어떻게 JSON 으로 Serialized 되어 있는지 확인할 있습니다. 다른 browser 들고 유사한 기능을 가지고 있습니다. 다른 유용한 Tool 로는 Fiddler 있으며 web debugging proxy 입니다. Fiddler 사용하여 HTTP traffic 있으며. HTTP request 재구성하여 request HTTP header 완벽하게 제어할 있게 해줍니다.

 

Azure 에서 App 실행하기

완성된 site 실제 구동하는 web app 으로 실행되는 모습을 보는 것은 어떻습니까? 다음 버튼을 간단히 click 하는 것만으로 여러분의 Azure 계정에 앱의 전체 버전을 배포하는 것이 가능합니다.

Azure Solution 배포하려면 Azure 계정이 필요합니다. 계정을 가지고 있지 않다면, 다음과 같은 옵션을 사용할 있습니다 :

  • 무료로 Azure 계정을 여십시오 - 유료 Azure service 사용할 있는 credits 얻습니다. 모두 사용한 후에도 계정을 유지할 있으며 무료 Azure service 사용할 있습니다.
  • MSDN 구독자 혜택 활성화 - 여러분이 가진 MSDN subscription 매월 유료 Azure service 사용할 있는 credits 지급합니다.

 

다음 단계

 

 

 

 

 

행복한 고수되셔요~

 

woojja ))*

\\\\\\\\\\\\\\\\

 

PS : OnoNote 에 썼다가 이쪽으로 옮기니 보여지는 글씨들이 맘에 안드네요. ㅡㅡ;

불편하셔도 이해해주셔요. ^^;

 

 













저작자 표시 비영리 변경 금지
신고
Posted by woojja
2017.09.07 15:53

 

 

Web API

 

하나씩 한글로 바꾸어 보려고요. ^^

 

행복한 고수되셔요~

 

woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

 













저작자 표시 비영리 변경 금지
신고
Posted by woojja

 

 

Framework Version 2 이후의 MVC와 Web API 간의 주된 차이점은 Web API handler 의 경우 HttpTaskAsynHandler 의 Subclass 인 반면 MVC 버전의 MvcHandler 는 IHttpAsyncHandler 를 직접 구현하였다.

 

HttpTaskAsyncHandler 는 Web API 2 에서 지원되는 .NET version 인 .NET 4.5 에만 있다.

 

동일한 ASP.NET process 내에서 MVC와 Web API 를 동시에 구동할 때 ASP.NET 은 HttpApplication을 사용하게된다.

Request 가 들어오면 MapRequestHandler event 에서 사용할 Http Handler 를 결정한다.

이 단계에서 route matching 이 일어나고 request 는 선택된 route 와 관련된 IRoutHandler 를 통해 이동하게된다.

 

IRouteHandler 의 유일한 목적은 request 를 처리(handle)할 수 있는 IHttpHandler 를 생성하는 것이다.

만일 IRouteHandler 가 HttpControllerRouteHandler (Web API route) 라면 Web API 경로가 선택되어 Request 는 HttpControllerHandler 에서 끝마치게되며, 반대로 Route Handler 가 MvcRouteHandler 라면 MVC 경로를 취하여 MvcHandler 로 이동한다.

 

 

(APRESS) ASP.NET Web API 2 Recipes 중에서...

 

 

행복한 고수되셔요. ^^*

 

 

woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

 

 

 













저작자 표시 비영리 변경 금지
신고
Posted by woojja

Pro ASP.NET MVC 5 를 정리하고 있습니다.


SportsStore Site 를 작성하면서  필요한 Nuget Package 들 입니다.


Install-Package Ninject -version 3.0.1.10 -projectname SportsStore.WebUI
Install-Package Ninject.Web.Common -version 3.0.0.7 -projectname SportsStore.WebUI
Install-Package Ninject.MVC3 -Version 3.0.0.6 -projectname SportsStore.WebUI
Install-Package Moq -version 4.1.1309.1617 -projectname SportsStore.WebUI


Install-Package Ninject -version 3.0.1.10 -projectname SportsStore.UnitTests
Install-Package Ninject.Web.Common -version 3.0.0.7 -projectname SportsStore.UnitTests
Install-Package Ninject.MVC3 -Version 3.0.0.6 -projectname SportsStore.UnitTests
Install-Package Moq -version 4.1.1309.1617 -projectname SportsStore.UnitTests
Install-Package Microsoft.Aspnet.Mvc -version 5.0.0 -projectname SportsStore.UnitTests


Install-Package Microsoft.Aspnet.Mvc -version 5.0.0 -projectname SportsStore.Domain



행복한 고수되십시요.


woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\













저작자 표시 비영리 변경 금지
신고
Posted by woojja


ViewBag, TempData, ViewData, Session 의 수명



행복한 고수되십시요.


woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\













저작자 표시 비영리 변경 금지
신고
Posted by woojja

간만에 포스팅 합니다. 한 오백만년은 된 듯합니다. ㅋㅋㅋ

요즘엔 asp.net 을 가지고 맨땅에 헤딩하느라 고생이 이만 저만이 아니네요... ㅋㅋㅋ
전 winform 개발자이고 싶은데 말이죠... 푸헤헤

여튼 Bug 라고 공식적으로 알려진 사항인데 저는 이제야 알았네요...

내용은 이렇습니다.

Repeater 나 ListView Server Control 의 itemTemplate 에 RadioButton 을 추가하게 되면 grouping 을 할 수 없습니다.

이유인 즉은 iNamingContainer 인터페이스를 구현하는 녀석들이라서라고 하네요.

iNamingContainer 인터페이스의 특징은 item Template 내부에 추가되는 컨트롤들은 고유의 name 속성을 가져야하는 데...

아시다 시피 radio 버튼을 Group으로 묶어 주기 위해서는 아래와 같이 name 속성을 동일하게 해야햐죠?

<input id="Radio1" type="radio" name="1" />
<input id="Radio2" type="radio" name="1" />
<input id="Radio3" type="radio" name="1" />
<input id="Radio4" type="radio" name="1" />
<input id="Radio5" type="radio" name="1" />


그런데 iNamingContainer 인터페이스 를 구현하는 녀석들은 name 속성이 고유하게 생성이 되서 Group 으로 묶이지 않는 것이었습니다.
asp.net RadioButton 서버컨트롤이 가지고 있는 GroupName 이라는 속성을 주더라도 소용이 없는 거죠... ㅋㅋ

아래의 Repeater 나 ListView 가
        <asp:Repeater ID="Repeater1" runat="server">
            <ItemTemplate>
                <asp:RadioButton id="RadioButton1" runat="server" GroupName="RB" Text="<%#Container.DataItem.ToString()%>">
                </asp:RadioButton><br>
            </ItemTemplate>
        </asp:Repeater>

HTML Tag 로 Rendering 된 모습을 보게되면 아래와 같습니다.
<input id="MainContent_Repeater1_RadioButton1_0" type="radio" name="ctl00$MainContent$Repeater1$ctl00$RB" value="RadioButton1" /><label for="MainContent_Repeater1_RadioButton1_0">Test Value 0</label><br>           
<input id="MainContent_Repeater1_RadioButton1_1" type="radio" name="ctl00$MainContent$Repeater1$ctl01$RB" value="RadioButton1" /><label for="MainContent_Repeater1_RadioButton1_1">Test Value 1</label><br>            
<input id="MainContent_Repeater1_RadioButton1_2" type="radio" name="ctl00$MainContent$Repeater1$ctl02$RB" value="RadioButton1" /><label for="MainContent_Repeater1_RadioButton1_2">Test Value 2</label><br>

name 속성의 값이 모두 다르죠?

이러니 Group 으로 묶을 수 있겠습니까? ㅋㅋㅋ

http://support.microsoft.com/kb/316495/en-us
여기에 버그로 등록이 되어 있네요... 오랜 세월이 흘렀는데도 고쳐지지 않는 것을 보면... 쉽사리 건드리기 힘든 녀석인가 봅니다. 이해가 안가지만요... ㅋㅋ

그래서 해법을 찾아보았습니다. ㅋㅋㅋ

http://www.codeguru.com/csharp/csharp/cs_controls/custom/article.php/c12371/

GroupRadioButton 을 만드신 분도 계시군요...
http://www.codeproject.com/Articles/7960/How-to-group-RadioButtons


행복한 고수되십시요...













저작자 표시 비영리 변경 금지
신고
Posted by woojja

현재 WCF REST Starter Kit Preview 2 을 이용해서 Rest Service 를 제작하여 사용하고 있다.
그런데 문제가 발생했다.
기존에 개발하던 Laptop에서는 잘 작동하던 것이
새로운 Laptop에서는 아래와 같은 씨뻘건 에러를 내뱉으며 작동을 거부하는 것이 아닌가? ㅡㅡ'


어리석게도 단순히 파일 확장자만을 보고 MIME Type 이 문제일 것이라는 생각에만 집중을 하고 문제를 해결하기위해 두 컴을 비교하기 시작했고, 찾다찾다 안되어 구글링을 시작했다.

.svc 파일 형식이 aspnet_isapi 에 매핑되어 있어야 한다는 결론을 얻었다.

그래서 살펴보니 기존 Laptop 에는 등록되어 있는
svc-Integrated
svc-ISAPI-2.0
항목들이 새로운 Laptop 에는 등록되지 않은 것이 아닌가?

훔...
위 항목들의 등록과정은 다음과 같다.

IIS 단에서 등록을 해도 되겠지만 본인은 Default Web Site (기본 웹 사이트) 에서 진행하기로 하겠다.

위와 같이 "처리기 맵핑"을 클릭한다.


그리고 "관리되는 처리기 추가..." 를 클릭하고
요청경로 : *.svc
형식 : System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
이름 : svc-Integrated
을 입력하고 "확인" 을 클릭한다.

 
다음은 "스크립트 매핑 추가..." 를 클릭하고
요청경로 : *.svc
실행파일 : %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
이름 : svc-ISAPI-2.0
을 입력하고 "확인" 을 클릭한다.


그리고 잘 등록이 되었는지 확인한다.


그러면 Browser 로 가서 F5 를 눌러 화면을 Refresh 해서 확인해 본다.


또 이렇게 나의 허접함이 드러났다. ㅡㅡ'


하지만, 아직도 전 Laptop 과 비교해서 새 Laptop 에는 무엇을 설치를 하지 않아
녀석들이 등록되지 않았는지 알수가 없다.

아시는 분께서는 저의 무지함을 깨우쳐 주시기 바랍니다.



행복한 고수되십시요...


woojja ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\












저작자 표시 비영리 변경 금지
신고
Posted by woojja


Controller들은 Controllers Folder 에,
Java Script 는 Scripts Folder 에,  
MVC View File들은 Views 폴더에 담아야 한다.

행복한 고수되십시요.


woojja ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\












저작자 표시 비영리 변경 금지
신고
Posted by woojja

 

IIS 7 에서 URL Rewrite Module 을 사용해 보셔요...
재미나네요... ^^

http://www.iis.net/download/urlrewrite

아래 비디오를 통해서 설정하는 방법도 배워보시구요...

http://learn.iis.net/page.aspx/506/url-rewrite-module---video-walkthrough/


아~~ 또 한가지... IIS Extention 들을 찬찬히 살펴보시고
사용하실만한 것들을 설치하셔서 사용해 보십시요...


행복한 고수되셔요...


woojja ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\













저작자 표시 비영리 변경 금지
신고
Posted by woojja
[.NET/ASP.NET] - [ASP.NET] ASP.NET MVC2 Site 만들기 (1)
[.NET/ASP.NET] - [ASP.NET] ASP.NET MVC2 Site 만들기 (2)
[.NET/ASP.NET] - [ASP.NET] ASP.NET MVC2 Site 만들기 (3)
[.NET/ASP.NET] - [ASP.NET] ASP.NET MVC2 Site 만들기 (4)
[.NET/ASP.NET] - [ASP.NET] ASP.NET MVC2 Site 만들기 (5)
[.NET/ASP.NET] - [ASP.NET] ASP.NET MVC2 Site 만들기 (6)
이번엔 Controller  와 View  를 만들어 보겠습니다.
그림을 그냥 쭉 훑어 보시기만 해도 될 듯합니다.
Solution 탐색기의 Context Menu 도 직관적으로 구성되어 있어서 생성하기도 쉽고요...
그럼 Controller  부터 시작해 보겠습니다.

Controller Folder 를 오른쪽 클릭합니다.


Add/Controller... 를 클릭하여 Controller 를 추가합니다.
새로 만들어질 Controller  의 이름을 입력합니다.
Action Method 를 생성하진 않을 겁니다.

만들어진 Controller 의 내용을 아래와 같이 index 함수와 info 함수를 입력합니다.

    1 Namespace MvcSampleApp

    2 

    3     Public Class CustomerController

    4         Inherits System.Web.Mvc.Controller

    5         Private repository As New AdventureWorksRepository()

    6 

    7         '

    8         ' GET: /Customer

    9 

   10         Function Index() As ActionResult

   11             Return View()

   12         End Function

   13 

   14         Public Function Index(ByVal page As Nullable(Of Integer)) As ActionResult

   15             Dim viewData = New CustomerViewData()

   16             Dim currentPage As Integer = If(page, 0)

   17             viewData.Customers = Me.repository.GetCustomers(currentPage, 10)

   18             viewData.NextPage = currentPage + 1

   19             viewData.PreviousPage = If((currentPage <= 0), 0, currentPage - 1)

   20             Return View(viewData)

   21         End Function

   22 

   23         Public Function Info(ByVal id As Integer) As ActionResult

   24             Dim customer = Me.repository.GetCustomerById(id)

   25             Return View(customer)

   26         End Function

   27 

   28     End Class

   29 

   30 End Namespace


Controller 하나 더 만들어 보죠.
이번엔 Action Method  도 만들어 보죠.


아래와 같은 함수가 기본적으로 만들어질텐데요...
기본적으로 만들어진 함수를 아래와 같이 수정합니다.

    1 Namespace MvcSampleApp

    2 

    3     Public Class AddressController

    4         Inherits System.Web.Mvc.Controller

    5         Private repository As New AdventureWorksRepository()

    6 

    7         '

    8         ' GET: /Address/Create/5

    9         Function Create(ByVal customerId As Integer) As ActionResult

   10             Dim addressViewData = New AddressViewData With

   11                 {

   12                     .CustomerId = customerId

   13                 }

   14             Return View(addressViewData)

   15         End Function

   16 

   17         '

   18         ' POST: /Address/Create

   19         <AcceptVerbs(HttpVerbs.Post)> _

   20         Function Create(ByVal customerId As Integer, ByVal collection As FormCollection) As ActionResult

   21             Try

   22                 Dim addressViewData = New AddressViewData()

   23                 UpdateModel(addressViewData)

   24                 Me.repository.AddAddress(addressViewData.Address, customerId)

   25                 Return RedirectToAction("Info", "Customer", New With {.id = customerId})

   26             Catch

   27                 Return View()

   28             End Try

   29         End Function

   30 

   31         '

   32         ' GET: /Address/Edit/5

   33         Public Function Edit(ByVal addressId As Integer, ByVal customerId As Integer) As ActionResult

   34             Dim addressViewData As New AddressViewData()

   35             addressViewData.Address = Me.repository.GetAddressById(addressId)

   36             addressViewData.CustomerId = customerId

   37             Return View(addressViewData)

   38         End Function

   39 

   40         '

   41         ' POST: /Address/Edit/5

   42         <AcceptVerbs(HttpVerbs.Post)> _

   43         Public Function Edit(ByVal addressId As Integer, ByVal customerId As Integer, ByVal collection As FormCollection) As ActionResult

   44             Try

   45                 Dim addressViewData As New AddressViewData()

   46                 addressViewData.Address = Me.repository.GetAddressById(addressId)

   47                 UpdateModel(addressViewData)

   48                 Me.repository.UpdateAddress()

   49                 Return RedirectToAction("Info", "Customer", New With {.id = customerId})

   50             Catch

   51                 Return View()

   52             End Try

   53         End Function

   54 

   55         '

   56         ' POST: /Address/Edit/5

   57         <HttpPost()> _

   58         Function Edit(ByVal id As Integer, ByVal collection As FormCollection) As ActionResult

   59             Try

   60                 ' TODO: Add update logic here

   61 

   62                 Return RedirectToAction("Index")

   63             Catch

   64                 Return View()

   65             End Try

   66         End Function

   67 

   68         '

   69         ' GET: /Address/Delete/5

   70         Public Function Delete(ByVal addressId As Integer, ByVal customerId As Integer) As ActionResult

   71             Dim address = Me.repository.GetAddressById(addressId)

   72             Me.repository.DeleteAddress(address, customerId)

   73             Return RedirectToAction("Info", "Customer", New With {.id = customerId})

   74         End Function

   75 

   76         '

   77         ' POST: /Address/Delete/5

   78         <HttpPost()> _

   79         Function Delete(ByVal id As Integer, ByVal collection As FormCollection) As ActionResult

   80             Try

   81                 ' TODO: Add delete logic here

   82 

   83                 Return RedirectToAction("Index")

   84             Catch

   85                 Return View()

   86             End Try

   87         End Function

   88     End Class

   89 

   90 End Namespace


이젠 방금전에 만든 CustomerController 의 info 함수에 연결할 View 를 생성할겁니다.
함수상에서 오른쪽 클릭을 하면 나타나는 Context Menu 에서 "Add View..." 를 클릭합니다.
참 쉽죠~~잉? ^^


ComboBox 에서 DataClass를 입력합니다.



만들어진 View 를 아래와 같이 수정합니다.

   40 <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

   41     <h2>

   42         Customer Information</h2>

   43     <fieldset>

   44         <p>

   45             CompanyName:

   46             <%= Html.Encode(Model.CompanyName) %>

   47         </p>

   48         <p>

   49             EmailAddress:

   50             <%= Html.Encode(Model.EmailAddress) %>

   51         </p>

   52         <p>

   53             Name:

   54             <%= Html.Encode(Model.Title + " " + Model.FirstName + " " + Model.MiddleName + Model.LastName) %>

   55         </p>

   56         <p>

   57             Phone:

   58             <%= Html.Encode(Model.Phone) %>

   59         </p>

   60     </fieldset>

   61         <h3>

   62         Addresses</h3>

   63     <ul>

   64         <% For Each address In Model.CustomerAddress%>

   65         <li>

   66             <%= address.Address.AddressLine1 + " " + address.Address.AddressLine2 + " - " + address.Address.City %>

   67             <%= Html.ActionLink("(Edit)", "Edit", "Address", New With {address.AddressID, Model.CustomerID}, Nothing)%>

   68             <%= Html.ActionLink("(Delete)", "Delete", "Address", New With {address.AddressID, Model.CustomerID}, Nothing)%>

   69         </li>

   70         <% Next%>

   71     </ul>

   72     <%= Html.ActionLink("Add New Address", "Create", "Address", New With {Model.CustomerID}, Nothing)%>

   73 

   74 </asp:Content>

   75 


CustomerController 와 AddressController 에 포함되어있는 ActionMethod 에 대한 View 를 같은 방식으로 만듭니다.
그 내용은 유사하므로 이곳에 설명하진 않습니다.


F5 를 클릭해서 Web Application을 실행해 봅니다.

Customer 링크를 클릭해서 리스트를 확인하고...
Page 를 이동해 봅니다.
Address 추가도 해보고...

수정/삭제도 해봅니다.


너무 쉬운내용을 어렵게(설명한답시고 캡쳐하고, 주저리주저리) 풀어 놓은것 아닌가 합니다.
어느정도 MVC2 Application 을 작성하는 방식에 대해서 살펴보았습니다.

기본적으로 구성하는 것. 한마디로 참 쉽죠~~잉... ^^'
허지만 세상일이란 기본적인것만 있지 않죠... ㅋㅋ

여튼 이후에는 이 이외에 Unit Test 를 설정하고, Area 를 구성하는 것도 살펴보려합니다.
자세한 사항에 대해서 살펴보기전까지는 기본 구성에 대해서만 진행할려구요...

 
행복한 고수되십시요.


woojja ))*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\












저작자 표시 비영리 변경 금지
신고
Posted by woojja
이전버튼 1 2 3 이전버튼

티스토리 툴바