Asp.Net MVC系列--基础篇(3)

这一节,介绍一下如何用已经创建好的Domain Model 层,来构建一个简单的demo

1.右键controller->添加一个controller 命名为StudentClassController

完成以下Action:

 public class StudentClassController :Controller
{
//先传进来接口,后面会用structuremap来做DI
       private IStudentContext _studentContext;
       public StudentClassController(IStudentContext context)
       {
           _studentContext = context;
       }
 
//用于显示一个class列表
       public ActionResult ClassList()
       {
           var model = _studentContext.StudentClasseList;
           return View("ClassList", model);
       }
 
//用于显示class详细内容,学生列表
       public ActionResult ClassDetails(int classId)
       {
           var model = _studentContext.StudentClasseList.First(c => c.Id ==classId);
           var students = _studentContext.StudentList.Where(s => s.ClassId ==classId);
 
           model.Students = students.Any() ? students.ToList() : newList<Student>();
 
           return View("ClassStudentList", model);
       }
 
//指向创建studentview,传递classId过去
       public ActionResult GotoCreateStudent(int classId)
       {
           return View("CreateStudent", new Student {ClassId = classId});
       }
 
 
//创建一个student,创建成功并返回到class 详细信息页面
       [HttpPost]
       public ActionResult CreateStudent(Student student)
       {
           if (ModelState.IsValid)
           {
               _studentContext.Students.Add(student);
                _studentContext.Save();
 
                var model =_studentContext.StudentClasses.Find(student.ClassId);
                model.Students =_studentContext.Students.Where(s => s.ClassId == student.ClassId).ToList();
 
                returnView("ClassStudentList",model);   
            }
           return View("CreateStudent", student);
       }


接下来,添加三个View

1.右键Views->添加文件夹->StudentClass

2.右键StudentClass->添加View->Class List View


View代码:

@modelIEnumerable<eStudentDomain.Entity.StudentClass>
 
@{
   Layout = null;
}
 
<!DOCTYPE html>
 
<html>
<head>
   <meta name="viewport"content="width=device-width" />
   <title>ClassList</title>
</head>
<body>
  
   <table>
       <tr>
           <th>
                @Html.DisplayNameFor(model=> model.Name)
           </th>
           <th></th>
       </tr>
   
   @foreach (var item in Model) {
       <tr>
           <td>
                @Html.DisplayFor(modelItem=> item.Name)
           </td>
           <td>
               @Html.ActionLink("Details", "ClassDetails","StudentClass", new { classId = item.Id }, null);
 
           </td>
       </tr>
    }
   
   </table>
</body>
</html>


代码说明:使用此View的合约,需要传递一个IEumerable<StudentClass> , 这个View会循环输出班级列表表格,最后一个ActionLink指向StudentClassController的ClassDetails Action,传递参数classId。

这个Action会拿到ClassId取Class信息,放入student List,传递并指向到ClassStudentList View。

2.右键Views->StudentClass,创建View-> ClassStudentList

View 代码:

@model eStudentDomain.Entity.StudentClass
 
@{
   Layout = null;
}
 
<!DOCTYPE html>
 
<html>
<head>
   <meta name="viewport"content="width=device-width" />
   <title>ClassStudentList</title>
</head>
<body>
   
   <table>
       <tr>
           <th>
                @Html.DisplayNameFor(model=> model.Name)
           </th>
           <th></th>
       </tr>
 
       @foreach (var item in Model.Students) {
           <tr>
                <td>
                    @Html.DisplayFor(modelItem=> item.Name)
                </td>
           </tr>
       }
   
   
   </table>
   <p>
       @Html.ActionLink("Add Student", "GotoCreateStudent","StudentClass", new { classId = Model.Id },null)
       
   </p>
   <p>
       @Html.ActionLink("Back", "ClassList","StudentClass", null, null);
   </p>
</body>
</html>


代码说明:此View接收一个StudentClass类作为参数,并且循环输出了class里面的student列表。最后ActionLink指向了StudentClass controller的GoToCreateStudent的Action,传递参数 classId。这个Action拿到ClassId传递指向CreateStudent View。

3.右键StudentClass->添加View->添加CreateStudent View

@using eStudentDomain.Entity
@model eStudentDomain.Entity.Student
 
@{
   Layout = null;
}
 
<!DOCTYPE html>
 
<html>
<head>
   <meta name="viewport"content="width=device-width" />
   <title>CreateStudent</title>
</head>
<body>
   <scriptsrc="~/Scripts/jquery-1.7.1.min.js"></script>
   <scriptsrc="~/Scripts/jquery.validate.min.js"></script>
   <scriptsrc="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
   
    @using(Html.BeginForm("CreateStudent","StudentClass",FormMethod.Post)){
       @Html.ValidationSummary(true)
   
        <fieldset>
           @Html.HiddenFor(model => model.ClassId);
           <legend>Student</legend>
   
           <div class="editor-label">
                @Html.LabelFor(model =>model.Name)
           </div>
           <div class="editor-field">
                @Html.EditorFor(model =>model.Name)
               @Html.ValidationMessageFor(model => model.Name)
           </div>
 
           <div class="editor-label">
                @Html.LabelFor(model =>model.JoinDate)
           </div>
           <div class="editor-field">
                @Html.EditorFor(model =>model.JoinDate)
               @Html.ValidationMessageFor(model => model.JoinDate)
           </div>
   
           <div class="editor-label">
                @Html.LabelFor(model =>model.GraduateDate)
           </div>
           <div class="editor-field">
                @Html.EditorFor(model =>model.GraduateDate)
               @Html.ValidationMessageFor(model => model.GraduateDate)
            </div>
   
           <p>
                <inputtype="submit" value="CreateStudent" />
           </p>
       </fieldset>
    }
   
   <div>
       @Html.ActionLink("Back to List", "ClassDetails","StudentClass", new { classId = Model.ClassId }, null);
   </div>
</body>
</html>


代码说明:

这个View接收Student实体。

@using(Html.BeginForm("CreateStudent","StudentClass",FormMethod.Post)){


表明,这个表单指向StudentClass controller 的CreateStudent Action,表单提交方式为POST。

在CreateStudent Action 里,接收一个Student对象,并限制HTTP请求方式为POST。这里传输序列化协议为JSON,但是mvc已经把这个过程做好了,表单提交后,Model将被序列化为JSON以POST请求提交到服务器,Action接收到的,已经是反序列化好的Student对象了。Action创建对象,返回ClassStudentList View,给一个classId。

最后,放一个ActionLink,返回StudentClass Controller的ClassDetails Action,给一个classId,这个Action里,将取出classId内的students,指向StudentClassList View,给一个StudentClass对象。

View和Controller的代码都做完了,还有DI没做,我们去package manager,安装 structure map。

会看到生成好的 IoC.cs 文件,打开

添加一行(红色)代码即可。

namespaceeStudentManager.DependencyResolution {
   public static class IoC {
       public static IContainer Initialize() {
           ObjectFactory.Initialize(x =>
                        {
                            x.Scan(scan =>
                                    {
                                       scan.TheCallingAssembly();
                                       scan.WithDefaultConventions();
                                    });
                           x.For<IStudentContext>().Use<eStudentDbContext>();
                            //                x.For<IExample>().Use<Example>();
                        });
           return ObjectFactory.Container;
       }
    }
}


最后,我们可以选择配置一下路由,默认指向ClassList :


好了,这个例子就完成了。运行一下:

Class List :

Student Class


点击Add Student,进入CreateStudent


点击CreateStudent,回到了Class Student:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值