MVC几种传值方式


一,Model

       public class Course
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }

        public class Teacher
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public List Courses { get; set; }
        }

        public class Student
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public List Courses { get; set; }
        }

二,使用ViewData传递多个Model

HomeController

        public ActionResult Index()
        {
            ViewData["Courses"] = _repository.GetCourses();
            ViewData["Students"] = _repository.GetStudents();
            ViewData["Teachers"] = _repository.GetTeachers();
            return View();
        } 

Home/Index.cshtml

@using MvcApplication1.Models
@using System.Web.Helpers;
@{
    
    Layout = null;
}
 

 


    
    ViewDataDemo
    
    


    

选择课程

老师课程表

学生上课表

 三,使用ViewBag传递多个Model

 HomeController

        public ActionResult ViewBagDemo()
        {
            ViewBag.Courses = _repository.GetCourses();
            ViewBag.Students = _repository.GetStudents();
            ViewBag.Teachers = _repository.GetTeachers();
            return View();
        } 

Home/ViewBagDemo.cshtml

 下拉框遍历课程改成: 
@foreach (var course in ViewBag.Courses)     

 

getTeacherTable()方法中改成: 
var teachers = @Html.Raw(Json.Encode(ViewBag.Teachers));

 

getStudentTable()方法中改成: 
var students = @Html.Raw(Json.Encode(ViewBag.Students));

@Html.Raw(Json.Encode(ViewData["Students"]))是把Model转换成json字符串,需要用到System.Web.Helpers,把此类库引用到项目,并且必须设置"复制到本地属性"为true,否则报错。

四,使用部分视图传递多个Model

HomeController

        public ActionResult PartialViewDemo()
        {
            List courses = _repository.GetCourses();
            return View(courses);
        }
       
        public ActionResult StudentsToPVDemo(string courseName)
        {
            IEnumerable courses = _repository.GetCourses();
            var selectedCourseId = (from c in courses
                                    where c.Name == courseName
                                    select c.Id).FirstOrDefault();
 
            IEnumerable students = _repository.GetStudents();
            var studentsInCourse = students.Where(s => s.Courses.Any(c => c.Id == selectedCourseId)).ToList();
 
            return PartialView("StudentPV", studentsInCourse);
        }
 
        public ActionResult TeachersToPVDemo(string courseName)
        {
            IEnumerable courses = _repository.GetCourses();
            var selectedCourseId = (from c in courses
                                    where c.Name == courseName
                                    select c.Id).FirstOrDefault();
 
            IEnumerable teachers = _repository.GetTeachers();
            var teachersForCourse = teachers.Where(t => t.Courses.Any(c => c.Id == selectedCourseId)).ToList();
 
            return PartialView("TeacherPV", teachersForCourse);
        } 



Home/PartialViewDemo.cshmtl

@model IEnumerable
 
@{
    Layout = null;
}
 

 


    
    PatialViewDemo
    
    


    

选择课程

老师课程表

学生上课表




TeacherPV.cshtml与StudentPV.cshtml

@model IEnumerable
 
"tblTeacherDetail">
    
        
        
    
    @foreach (var item in Model)
    {
        
            
            
        
    }
编号 名称
@item.Id @item.Name

五, 使用TempData传递多个Model

HomeController

        public ActionResult TempDataDemo()
        {
            //第一次从数据库读取数据放到TempData中,以后的请求从TempData中获取数据
            TempData["Courses"] = _repository.GetCourses();
 
            //让TempData保存数据,直到下一次请求
            TempData.Keep("Courses");
            return View();
        }
 
        public ActionResult TeachersTempData(string courseName)
        {
            var courses = TempData["Courses"] as IEnumerable;
 
            //由于TempData["Courses"]还要被下一次请求,继续TempData保存数据
            TempData.Keep("Courses");
 
            var selectedCourseId = (from c in courses
                where c.Name == courseName
                select c.Id).FirstOrDefault();
 
            IEnumerable teachers = _repository.GetTeachers();
            var teachersForCourse = teachers.Where(t => t.Courses.Any(c => c.Id == selectedCourseId)).ToList();
 
            return PartialView("TeacherPV", teachersForCourse);
        }
 
        public ActionResult StudentsTempData(string courseName)
        {
            var courses = TempData["Courses"] as IEnumerable;
 
            //由于TempData["Courses"]还要被下一次请求,继续TempData保存数据
            TempData.Keep("Courses");
 
            var selectedCourseId = (from c in courses
                                    where c.Name == courseName
                                    select c.Id).FirstOrDefault();
 
            IEnumerable students = _repository.GetStudents();
            var studentsForCourse = students.Where(s => s.Courses.Any(c => c.Id == selectedCourseId)).ToList();
 
            return PartialView("StudentPV", studentsForCourse);
        }


Home/TempDataDemo.cshtml

下拉框遍历课程: 
@foreach (var course in Model)

 

ajax请求老师课程表: 
@Url.Action("TeachersTempData","Home")

 

ajax请求学生上课表: 
@Url.Action("StudentsTempData","Home")

六,使用ViewModel传递多个Model

View Model

    public class SchoolVm
    {
        public List Courses { get; set; }
        public List Students { get; set; }
        public List Teachers { get; set; }
    }
 

□ HomeController

        public ActionResult ViewModelDemoVM()
        {
            SchoolVm vm = new SchoolVm();
            vm.Courses = _repository.GetCourses();
            vm.Teachers = _repository.GetTeachers();
            vm.Students = _repository.GetStudents();
            return View(vm);
        }
 

□ Home/ViewModelDemoVM.cshtml

@model MvcApplication1.Models.SchoolVm

下拉框遍历课程: 
@foreach (var course in Model.Courses)

 

ajax请求老师课程表和学生上课表: 
@Html.Raw(Json.Encode(Model.Teachers)) 
@Html.Raw(Json.Encode(Model.Students))
mvc