当前位置: 首页 > news >正文

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:




 

相关文章:

  • [Windows 编程] 如何截获 Alt+Tab 事件
  • 下午调试的几个关于weblogic连接池的问题
  • Asp.Net Set Http Timeout
  • 现实与理想(中国台湾清华大学教授彭明辉)
  • c# 用反射获得静态类成员
  • Sql Server Table 中identity 重置...
  • Asp.Net 中使用HttpModule 做Session验证
  • Asp.Net MVC4系列---基础篇(4)
  • IE8 正式版官方下载链接
  • IE8 视频
  • [Web开发] 快速修复网页在IE8 下的显示兼容问题
  • 用手机连pc localhost 学习,调试网站
  • [Web开发] Web开发者必读:《IE8 开发技术概述》
  • Web Server IIS Asp.Net Http Module 不工作
  • SqlServer中decimal(numeric )、float 和 real 数据类型的区别
  • ES6指北【2】—— 箭头函数
  • 收藏网友的 源程序下载网
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【技术性】Search知识
  • 0基础学习移动端适配
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • axios 和 cookie 的那些事
  • CSS相对定位
  • Fastjson的基本使用方法大全
  • Github访问慢解决办法
  • js操作时间(持续更新)
  • October CMS - 快速入门 9 Images And Galleries
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • quasar-framework cnodejs社区
  • React+TypeScript入门
  • SpingCloudBus整合RabbitMQ
  • spring security oauth2 password授权模式
  • sublime配置文件
  • Zepto.js源码学习之二
  • 闭包--闭包作用之保存(一)
  • 基于 Babel 的 npm 包最小化设置
  • 力扣(LeetCode)22
  • 前端面试之CSS3新特性
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 再谈express与koa的对比
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 仓管云——企业云erp功能有哪些?
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • $.ajax()方法详解
  • (C#)获取字符编码的类
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (原創) 未来三学期想要修的课 (日記)
  • (原創) 物件導向與老子思想 (OO)
  • .bat批处理(十一):替换字符串中包含百分号%的子串