一、MVC的概念:
M:视图模型
V:视图
C:控制器
一、大致流程图

二、M(视图模型)
- 视图模型的验证
public class StudentDetailsViewModel
{
[Required]
[StringLength(100)]
public Student Student { get; set; }
[Required]
[StringLength(1000)]
public string PageTitle { get; set; }
}
三、V(视图)
- 布局视图LayoutView
- 视图节点Section
- 视图开始ViewStart
四、C(控制器)
- 控制器向页面传值
ViewData(字典的键值对)
ViewData["Title"]
ViewData["Model"]
ViewBag(动态类型赋值)
ViewBag.Title
ViewBag.Model
TempData(通过转向继续使用,因为它的值保存在Session中。但TempData只能经过一次传递,之后会被系统自动清除)
TempData["Title"]
TempData["Model"]
强类型视图
return(model)
补充ViewData与ViewBag本质是一样的,所以键不能重复,重复会导致覆写!
二、文件系统
一、文件目录
-
App_Data:用来保存数据文件
-
App_Start:包含ASP.NET-MVC系统启动的相关类文件
-
Controllers:存放整个项目“控制器”的代码文件
-
Models:存放整个项目的“模型”代码文件
-
Views:存放整个项目的“视图”代码文件
二、文件说明
- Views下面的Web.config文件:作用于视图的配置文件
- Global.asax文件:全局应用程序文件,一般和App_Start文件中的类配合使用
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
//注册区域
AreaRegistration.RegisterAllAreas();
//注册过滤器
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
//注册
RouteConfig.RegisterRoutes(RouteTable.Routes);
//注册打包器
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
- Packages.config文件:用于管理项目用到的程序集版本
- 根目录下的Web.config:作用于整个项目的配置文件
三、路由
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//忽略该模式的URL
routes.MapRoute(
name: "Default",//路由名称
url: "{controller}/{action}/{id}",//路由模板
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }//路由默认值,参数id可以为空
四、过滤器
Asp.Net中的过滤器是典型的面向AOP的应用!
一、过滤器的类型
| 过滤器类型 | 接口 | 默认实现 | 描述 |
|---|---|---|---|
| Action | IActionFilter | ActionFilterAttribute | 在动作方法之前及之后运行 |
| Result | IResultFilter | ActionFilterAttribute | 在动作结果被执行之前和之后运行 |
| AuthorizationFilter | IAuthorizationFilter | AuthorizeAttribute | 首先运行,在任何其它过滤器或动作方法之前 |
| Exception | IExceptionFilter | HandleErrorAttribute | 只在另一个过滤器、动作方法、动作结果弹出异常时运行 |
Action过滤器
/// <summary>
///方法过滤器
/// </summary>
public class MyActionFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//1、获取请求的类名和方法名
string strController = filterContext.RouteData.Values["controller"].ToString();
string strAction = filterContext.RouteData.Values["action"].ToString();
//2、用另一种方式获取请求的类名和方法名
string strController2 = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
string strAction2 = filterContext.ActionDescriptor.ActionName;
filterContext.HttpContext.Response.Write("控制器:" + strController + "<br/>");
filterContext.HttpContext.Response.Write("控制器:" + strController2 + "<br/>");
filterContext.HttpContext.Response.Write("Action:" + strAction + "<br/>");
filterContext.HttpContext.Response.Write("Action:" + strAction2 + "<br/>");
filterContext.HttpContext.Response.Write("Action执行前:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss fff") + "<br/>");
base.OnActionExecuting(filterContext);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("Action执行后:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss fff") + "<br/>");
base.OnActionExecuted(filterContext);
}
}
Result过滤器
/// <summary>
///视图过滤器
/// </summary>
public class MyResultFilterAttribute : ActionFilterAttribute
{
/// <summary>
/// 加载“视图”前执行
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("加载视图前执行 OnResultExecuting" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss fff") + "<br/>");
base.OnResultExecuting(filterContext);
}
/// <summary>
/// 加载“视图”后执行
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("加载视图后执行 OnResultExecuted" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss fff") + "<br/>");
base.OnResultExecuted(filterContext);
}
}
AuthorizeAttribute
/// <summary>
/// 授权过滤器
/// </summary>
public class MyAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
filterContext.HttpContext.Response.Write("OnAuthorization<br/>");
//注释掉父类方法,因为父类里的OnAuthorization方法会调用ASP.NET的授权验证机制
//base.OnAuthorization(filterContext);
}
}
Exception过滤器
/// <summary>
/// 异常处理过滤器
/// </summary>
public class MyHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
//1、获取异常对象
Exception ex = filterContext.Exception;
//2、记录异常日志
//3、重定向友好页面
filterContext.Result = new RedirectResult("~/error.html");
//4、标记异常已经处理完毕
filterContext.ExceptionHandled = true;
base.OnException(filterContext);
}
}
浙公网安备 33010602011771号