■ MvcCoreMvcBuilderExtensions 클래스의 AddApplicationPart 확장 메소드를 사용해 클래스 라이브러리에서 컨트롤러을 참조하는 방법을 보여준다. [TestLibrary 프로젝트] ▶ DataController.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; namespace TestLibrary { /// <summary> /// 데이터 컨트롤러 /// </summary> [Route("[controller]")] public class DataController : Controller { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 구하기 - Get() /// <summary> /// 구하기 /// </summary> /// <returns>문자열 열거 가능형</returns> [HttpGet] public IEnumerable<string> Get() { return new string[] { "test1", "test2" }; } #endregion } } |
[TestServer 프로젝트] ▶ Startup.cs
더 읽기
■ TextEditingController 클래스를 사용하는 방법을 보여준다. ▶ main.dart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
import 'package:flutter/material.dart'; void main() => runApp(TestApplication()); class TestApplication extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Test Application', home: MainPage(), ); } } class MainPage extends StatefulWidget { @override _MainPageState createState() => _MainPageState(); } class _MainPageState extends State<MainPage> { final controller = TextEditingController(); @override void initState() { super.initState(); controller.addListener(_printLatestValue); } @override void dispose() { controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Test Application'), ), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( children: <Widget>[ TextField( onChanged: (text) { print("첫 번째 텍스트 필드 : $text"); }, ), TextField( controller: controller, ), ], ), ), ); } _printLatestValue() { print("두 번째 텍스트 필드 : ${controller.text}"); } } |
test_app.zip
■ ConsumesAttribute/ProducesAttribute 클래스를 사용해 요청/응답 컨텐트 타입을 설정하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
using Microsoft.AspNetCore.Mvc; namespace TestProject.Controllers { /// <summary> /// 테스트 컨트롤러 /// </summary> [ApiController] [Route("api/[controller]")] [Consumes("application/json")] [Produces("application/json")] public class TestController : Controller { ... } } |
■ Controller 클래스의 Json 메소드를 사용해 JSON 데이터를 받는 방법을 보여준다. [TestServer 프로젝트] ▶ Models/TestModel.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
using System.ComponentModel.DataAnnotations; namespace TestServer.Models { /// <summary> /// 테스트 모델 /// </summary> public class TestModel { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region ID - ID /// <summary> /// ID /// </summary> public int ID { get; set; } #endregion #region 성명 - Name /// <summary> /// 성명 /// </summary> [Required] [StringLength(50, MinimumLength = 3, ErrorMessage = "성명은 3자 이상 입력해 주시기 바랍니다.")] public string Name { get; set; } #endregion } } |
▶ Models/TestRepository.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
using System.Collections.Generic; namespace TestServer.Models { /// <summary> /// 테스트 저장소 /// </summary> public class TestRepository { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region Field /// <summary> /// 테스트 딕셔너리 /// </summary> public static Dictionary<int, TestModel> TestDictionary; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Static #region 생성자 - TestRepository() /// <summary> /// 생성자 /// </summary> static TestRepository() { TestDictionary = new Dictionary<int, TestModel>(); TestDictionary.Add(1, new TestModel { ID = 1, Name = "홍길동" }); TestDictionary.Add(2, new TestModel { ID = 2, Name = "김철수" }); TestDictionary.Add(3, new TestModel { ID = 3, Name = "이용희" }); } #endregion } } |
▶ Controllers/TestController.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
using Microsoft.AspNetCore.Mvc; using System.Linq; using System.Net; using TestServer.Models; namespace TestServer.Controllers { /// <summary> /// 테스트 컨트롤러 /// </summary> [ApiController] [Route("api/[controller]")] public class TestController : Controller { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 리스트 구하기 - GetList() /// <summary> /// 리스트 구하기 /// </summary> /// <returns>리스트</returns> [HttpGet] public JsonResult GetList() { Response.StatusCode = (int)HttpStatusCode.OK; return Json(TestRepository.TestDictionary.Values.ToList()); } #endregion #region 항목 구하기 - GetItem(id) /// <summary> /// 항목 구하기 /// </summary> /// <returns>항목</returns> [HttpGet("{id:int}")] public JsonResult GetItem(int id) { if(TestRepository.TestDictionary.ContainsKey(id)) { Response.StatusCode = (int)HttpStatusCode.OK; return Json(TestRepository.TestDictionary[id]); } else { Response.StatusCode = (int)HttpStatusCode.BadRequest; return Json(null); } } #endregion #region 항목 추가하기 - AddItem(test) /// <summary> /// 항목 추가하기 /// </summary> /// <param name="test">테스트</param> /// <returns>처리 결과</returns> [HttpPost] public JsonResult Post([FromBody]TestModel test) { if(ModelState.IsValid) { if(TestRepository.TestDictionary.ContainsKey(test.ID)) { Response.StatusCode = (int)HttpStatusCode.BadRequest; return Json("FAILURE"); } TestRepository.TestDictionary.Add(test.ID, test); Response.StatusCode = (int)HttpStatusCode.Created; return Json("SUCCESS"); } Response.StatusCode = (int)HttpStatusCode.BadRequest; return Json("FAILURE"); } #endregion } } |
더 읽기
■ Controller 클래스의 View 메소드를 사용해 뷰에 컬렉션 데이터를 전달하는 방법을 보여준다. ▶ Models/MovieModel.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
using System; namespace TestProject.Models { /// <summary> /// 영화 모델 /// </summary> public class MovieModel { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region ID - ID /// <summary> /// ID /// </summary> public int ID { get; set; } #endregion #region 제목 - Title /// <summary> /// 제목 /// </summary> public string Title { get; set; } #endregion #region 생성일 - CreateDate /// <summary> /// 생성일 /// </summary> public DateTime CreateDate { get; set; } #endregion } } |
▶ Controllers/MovieController.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using TestProject.Models; namespace TestProject.Controllers { /// <summary> /// 영화 컨트롤러 /// </summary> public class MovieController : Controller { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 인덱스 페이지 처리하기 - Index() /// <summary> /// 인덱스 페이지 처리하기 /// </summary> public IActionResult Index() { List<MovieModel> list = new List<MovieModel>() { new MovieModel { ID = 1, Title = "원더 우먼" , CreateDate = new DateTime(2017, 1, 1) }, new MovieModel { ID = 2, Title = "베놈" , CreateDate = new DateTime(2018, 1, 1) }, new MovieModel { ID = 3, Title = "터미네이터 - 다크 페이트", CreateDate = new DateTime(2019, 1, 1) } }; return View(list); } #endregion } } |
▶ Views/Movie/Index.cshtml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
@model List<MovieModel> @{ Layout = null; } <!DOCTYPE html> <html> <head> <title>Controller 클래스 : View 메소드를 사용해 뷰에 컬렉션 데이터 전달하기</title> <style> table { border-collapse : collapse; } table th, table td { border : 1px solid black; padding : 10px; } </style> </head> <body> <h1>영화 목록</h1> <table> <tr> <th>번호</th> <th>제목</th> <th>개봉일</th> </tr> @foreach(MovieModel movie in Model) { <tr> <td>@movie.ID</td> <td>@movie.Title</td> <td>@movie.CreateDate.Year.ToString()</td> </tr> } </table> </body> </html> |
TestProject.zip
■ Controller 클래스의 ViewBag/ViewData 속성을 사용해 폼 데이터를 전달하는 방법을 보여준다. ▶ Controllers/TestController.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
using Microsoft.AspNetCore.Mvc; namespace TestProject.Controllers { /// <summary> /// 테스트 컨트롤러 /// </summary> public class TestController : Controller { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 인덱스 페이지 처리하기 - Index() /// <summary> /// 인덱스 페이지 처리하기 /// </summary> /// <returns>액션 결과</returns> [HttpGet] public IActionResult Index() { return View(); } #endregion #region 인덱스 페이지 처리하기 - Index(name, content) /// <summary> /// 인덱스 페이지 처리하기 /// </summary> /// <param name="name">명칭</param> /// <param name="content">컨텐트</param> /// <returns>액션 결과</returns> [HttpPost] public IActionResult Index(string name, string content) { ViewBag.name = name; ViewBag.content = content; return View(); } #endregion } } |
▶ Views/Test/Index.cshtml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
@{ Layout = null; } <p>Controller 클래스 : ViewBag/ViewData 속성을 사용해 폼 데이터 전달하기</p> <hr /> <p>HTML 태그 사용시</p> <form action="/Test/Index" method="post"> 이름 : <input type="text" name="name" value="" /><br /> 내용 : <input type="text" name="content" value="" /><br /> <input type="submit" value="제출" /> </form> <p>HELPER 메소드 사용시</p> <hr /> @using (Html.BeginForm()) { @Html.Label("이름 : ") @Html.TextBox("name") <br /> @Html.Label("내용 : ") @Html.TextBox("content") <br /> <input type="submit" value="제출" /> } <hr /> <p>@@ViewBag.Name : @ViewBag.Name</p> <p>@@ViewBag.Content : @ViewBag.Content</p> |
TestProject.zip
■ Controller 클래스의 View 메소드를 사용해 뷰에 컬렉션 데이터를 전달하는 방법을 보여준다. ▶ Models/TestModel.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
namespace TestProject.Models { /// <summary> /// 테스트 모델 /// </summary> public class TestModel { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region ID - ID /// <summary> /// ID /// </summary> public string ID { get; set; } #endregion #region 명칭 - Name /// <summary> /// 명칭 /// </summary> public string Name { get; set; } #endregion } } |
▶ Controllers/TestController.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using TestProject.Models; namespace TestProject.Controllers { /// <summary> /// 테스트 컨트롤러 /// </summary> public class TestController : Controller { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 인덱스 페이지 처리하기 - Index() /// <summary> /// 인덱스 페이지 처리하기 /// </summary> /// <returns>액션 결과</returns> public IActionResult Index() { List<TestModel> list = new List<TestModel>() { new TestModel { ID = "0001", Name = "홍길동" }, new TestModel { ID = "0002", Name = "백두산" }, new TestModel { ID = "0003", Name = "임꺽정" } }; return View(list); } #endregion } } |
▶ Views/Test/Index.cshtml
|
@using System.Collections.Generic; @model List<TestProject.Models.TestModel> @{ Layout = null; } <p>Controller 클래스 : View 메소드를 사용해 뷰에 컬렉션 데이터 전달하기</p> <hr /> <ul> @foreach(TestModel test in Model) { <li>@test.ID, @test.Name</li> } </ul> |
TestProject.zip
■ Controller 클래스의 View 메소드를 사용해 뷰에 데이터를 전달하는 방법을 보여준다. ▶ Models/TestModel.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
namespace TestProject.Models { /// <summary> /// 테스트 모델 /// </summary> public class TestModel { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region ID - ID /// <summary> /// ID /// </summary> public string ID { get; set; } #endregion #region 명칭 - Name /// <summary> /// 명칭 /// </summary> public string Name { get; set; } #endregion } } |
▶ Controllers/TestController.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
using Microsoft.AspNetCore.Mvc; using TestProject.Models; namespace TestProject.Controllers { /// <summary> /// 테스트 컨트롤러 /// </summary> public class TestController : Controller { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 인덱스 페이지 처리하기 - Index() /// <summary> /// 인덱스 페이지 처리하기 /// </summary> /// <returns>액션 결과</returns> public IActionResult Index() { TestModel test = new TestModel(); test.ID = "0001"; test.Name = "모델 1"; return View(test); } #endregion } } |
▶ Views/Test/Index.cshtml
|
@model TestProject.Models.TestModel @{ Layout = null; } <p>Controller 클래스 : View 메소드를 사용해 뷰에 데이터 전달하기</p> <hr /> <p>@@Model.ID : @Model.ID</p> <p>@@Model.Name : @Model.Name</p> |
TestProject.zip
■ Controller 클래스의 ViewBag/ViewData 속성을 사용해 뷰에 데이터를 전달하는 방법을 보여준다. ▶ Controllers/TestController.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
using Microsoft.AspNetCore.Mvc; namespace TestProject.Controllers { /// <summary> /// 테스트 컨트롤러 /// </summary> public class TestController : Controller { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 인덱스 페이지 처리하기 - Index() /// <summary> /// 인덱스 페이지 처리하기 /// </summary> /// <returns>액션 결과</returns> public IActionResult Index() { ViewBag.Name = "홍길동"; ViewBag.Age = 30; ViewBag.성별 = "남자"; ViewData["Address"] = "서울시"; return View(); } #endregion } } |
▶ Views/Test/Index.cshtml
|
@{ Layout = null; } <p>Controller 클래스 : ViewBag/ViewData 속성을 사용해 뷰에 데이터 전달하기</p> <hr /> <p>ViewBag.Name : @ViewBag.Name</p> <p>ViewBag.Age : @ViewBag.Age</p> <p>ViewBag.성별 : @ViewBag.성별</p> <p>ViewBag.Address : @ViewBag.Address</p> <p>ViewData["Address"] : @ViewData["Address"]</p> |
TestProject.zip
■ ControllerBase 클래스의 Content 메소드를 사용하는 방법을 보여준다. ▶ Controllers/TestController.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
using Microsoft.AspNetCore.Mvc; namespace TestProject.Controllers { /// <summary> /// 테스트 컨트롤러 /// </summary> public class TestController : Controller { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 인덱스 페이지 처리하기 - Index() /// <summary> /// 인덱스 페이지 처리하기 /// </summary> /// <returns>액션 결과</returns> public IActionResult Index() { return View(); } #endregion #region 컨텐트 페이지 처리하기 - Content() /// <summary> /// 컨텐트 페이지 처리하기 /// </summary> /// <returns>액션 결과</returns> public IActionResult Content() { return Content("테스트 문자열 입니다."); } #endregion } } |
TestProject.zip
■ Controller 클래스에서 액션 메소드를 사용하는 방법을 보여준다. ▶ Controllers/TestController.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
using Microsoft.AspNetCore.Mvc; using System; namespace TestProject.Controllers { /// <summary> /// 테스트 컨트롤러 /// </summary> public class TestController : Controller { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 인덱스 페이지 처리하기 - Index() /// <summary> /// 인덱스 페이지 처리하기 /// </summary> public void Index() { } #endregion #region 문자열 페이지 처리하기 - String() /// <summary> /// 문자열 페이지 처리하기 /// </summary> /// <returns>문자열</returns> public string String() { return "문자열을 반환하는 액션 메소드 입니다."; } #endregion #region 날짜 페이지 처리하기 - Date() /// <summary> /// 날짜 페이지 처리하기 /// </summary> /// <returns>날짜/시간</returns> public DateTime Date() { return DateTime.Now; } #endregion #region 디폴트 페이지 처리하기 - Default() /// <summary> /// 디폴트 페이지 처리하기 /// </summary> /// <returns>액션 결과</returns> public IActionResult Default() { return View(); } #endregion } } |
▶ Views/Test/Default.cshtml
|
@{ Layout = null; } <p>테스트 컨트롤러의 Default 메서드 호출시 출력되는 뷰 페이지</p> |
TestProject.zip