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

来源:互联网 发布:linux 从u盘启动 编辑:程序博客网 时间:2024/06/06 09:23

 

这一节,介绍一下如何用已经创建好的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:




 

5 0
原创粉丝点击