一、MVC的概念:

M:视图模型

V:视图

C:控制器

一、大致流程图

img

二、M(视图模型)

  1. 视图模型的验证
public class StudentDetailsViewModel
{
    [Required]
    [StringLength(100)]
    public Student Student { get; set; }
    [Required]
    [StringLength(1000)]
    public string PageTitle { get; set; }
}

三、V(视图)

  1. 布局视图LayoutView
  2. 视图节点Section
  3. 视图开始ViewStart

四、C(控制器)

  1. 控制器向页面传值

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);
        }
    }

posted on 2021-09-22 15:01  魔法乐  阅读(60)  评论(0)    收藏  举报