ASP.NET MVC
组成部分
Model, View, Controller
Razor 语法(.cshtml文件)
@{} 括号中 C# 代码
括号中写 C# 代码
@if()
{
}
@foreach()
{
}
@() 里面是 C# 表达式
~/ 开始为虚拟路径
Controller 给 View 传递数据的方式
ViewData 和 ViewBag 传递数据
- ViewData["name"] = value; 在 cshtml 中可直接使用 ViewData["name"] 获取
- ViewBag.name = value; 在 cshtml 中可使用 ViewBag.name 获取
- ViewData 和 ViewBag 共享数据
Model 传递数据
- Controller 的某个方法(Action)中返回 return View(model) 传入
- 弱类型
- 不在 cshtml 中没有声明 @model 模型类的全称
- 强类型
- 在 cshtml 中没有声明 @model 模型类的全称
请求中携带参数/path?id=1, Controller 中的 Action 如何接受
- MethodName(MethodNameModel model)
- MethodName(int id)
注意
- 默认一般情况下 Controller 中的 Action 是无法重载的, 否则会报错
- 但是通过添加 HttpGet, HttpPost 等 Attribute 则可以
Controller 的 ActionResult
- ViewResult
- RedirectResult
- FileResult
- JsonResult
- return Json(data) // 默认不允许 GET
View() 和 Redirect() 区别
- View() 是同一个请求(和其他的 Action 共享 ViewData 和 ViewBag)
- Redirect() 要求客户端发起一个新的请求(ViewData和ViewBag会清空)
Controller 属性
- ViewData
- ViewBag
- Session
- TempData: 取出就销毁
数据验证
在 model 的属性上添加属性
- Required
- StringLength(num, MinimumLength=num1)
- Range(a, b)
- Compare("")
- EmailAddress
- Phone
- RegularExpression
每个 Attribute 中有 ErrorMessage参数
自定义验证
- 继承 ValidationAttribute
- 重写 IsValid(object value)
- 如果希望实现正则表达式, 直接继承 RegularExpression
- 构造方法注意使用 base("期望的正则表达式")
- 在构造方法中 this.ErrorMessage = ""用来提示错误
Filters
全局的
- IAuthentication
- IAction
局部的
- 继承 FilterAttribute, 在期望的Action添加属性
FilterContext 对象
- filterContext.ActionDescriptor.ControllerDescriptor.ControllerName
- filterContext.ActionDescriptor.ActionName
- filterContext.HttpContext.Session
- filterContext.Result
- filterContext.HttpContext.Response(.Redirect()
注册
在 Global.asax.cs 中使用 GlobalFilters.Filters.Add(new Xxx())
Linq
示例代码
- from item in items
select item.value
- from item in items
select new {id=item.Id, Name=item.Name}
- from item in items
orderby item.id descending
select item
- from item in items
join other in others on item.Id equals other.Id
select new {itemName=item.name, otherName=other.Name}
MVC 项目三层架构
UI (MVC 就是 UI 层), BLL (业务逻辑层), DTO(Data Translate Object), DAL(数据访问层)
可以将 BLL 和 DAL 合并成 Service 层