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: