티스토리 뷰

ASP.NET MVC5에서 View로 데이터를 전달하는 방법에 대해서 정리해 보았다.

  • ViewData
  • ViewBag
  • ViewModel

ViewData

  • ViewData는 dictionary 타입인 ViewDataDictionary로부터 파생됨

  • ViewData는 current request 동안에만 유효함. redirection 이 발생하면 초기화됨

  • ViewData는 사용하기 전에 type cast가 필수

    StudentController.cs
    public ActionResult Index()
    {
        IList<Student> studentList = new List<Student>();
        studentList.Add(new Student(){ StudentName = "Jiwoo" });
        studentList.Add(new Student(){ StudentName = "Yoono" });
    
        ViewData["students"] = studentList;
    
        return View();
    }
    
    index.cshtml
    <ul>
    @foreach (var std in ViewData["students"] as IList<Student>)
    {
        <li>
            @std.StudentName
        </li>
    }
    </ul>
    

ViewBag

  • ViewBag C# 4.0부터 지원하는 dynamic features를 활용하는 동적 속성

  • ViewBag은 내부적으로 ViewData에 저장하기 때문에 ViewData의 key 값과 ViewBag의 속성 값이 같으면 안됨 (ViewBag 실제로 ViewData를 감싸는 wrapper)

    // 이렇게 같이 쓰면 안됨
    ViewData["TotalStudents"] = 10;
    ViewBag.TotalStudents = 20;
    
  • ViewData와 동일하게 current request 동안에만 유효하고 redirection이 발생하면 초기화 됨.

  • 사용하기 전에 type cast 필수

  • 왜 만들었는지 모르겠다;;

    ViewBag Snippet
    ViewBag.students = studentList;
    

ViewModel

  • ViewData와 ViewBag은 Compile시 안전하지 않기 때문에(TypeSafe 하지 않음) ViewModel을 사용하여 View로 Data를 전달하는 것이 바람직 함

  • ViewModel은 특별히 View를 위해 만들어진 Model클래스

  • Convention : ViewModels라는 폴더 밑에 ~ViewModel 로 끝나도록 Naming 해야 함

  • 아래와 같이 2개 이상의 클래스의 정보를 ViewModel에 담아서 View로 전달 할 수 있음

    StudentInfoViewModel.cs
    public class StudentInfoViewModel  
    {  
        public Student Student { get; set; }  
        public List<Subject> Subjects { get; set; }  
    }
    
    StudentController.cshtml
    public ActionResult Index()  
    {  
        var student = new Student  
        {  
            StudentName = "Wooyoung"  
        };  
    
        var subjects = new List<Subject>  
        {  
            new Subject { Id = 1, SubjectName = "Math" },  
            new Subject { Id = 5, SubjectName = "Science" }  
        };  
    
        var viewModel = new StudentInfoViewModel  
        {  
            Student = student,  
            Subjects = subjects  
        };  
    
        return View(viewModel);  
    } 
    
    index.cshtml
    @model SCMS.ViewModels.StudentInfoViewModel   
    
    <h2>@Model.Student.Name</h2>  
    <h3>Subjects</h3>  
    <ul>  
        @foreach (var subject in Model.Subjects)  
        {  
            <li>@subject.SubjectName</li>  
        }  
    </ul> 
    

'ASP.NET' 카테고리의 다른 글

파일 다운로드 구현하기  (0) 2019.02.25
ASP.NET MVC5 라우팅  (0) 2018.07.25
Word 문서 HTML로 변환하기  (0) 2018.05.29
Docker로 ASP.NET Core Web API 배포하기  (0) 2017.12.20
ASP.NET Core Web API Project 만들기  (0) 2017.12.20
댓글