ASP.NET MVC

Posted 小企鹅推雪球!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET MVC相关的知识,希望对你有一定的参考价值。

ASP.NET mvc控制器

  1. 控制器是ASP.NET MVC应用程序的中心单元,控制器是第一个请求接收者,与传入的HTPP请求进行交互,
  2. 控制器决定选择哪个模型,然后从模型中获取数据,并将数据传递给相应的视图,然后渲染视图
  3. 实际上,控制器控制应用程序的整体流程,并输出正确的输出
  4. 控制器继承自System.Web.mvc.controller的c#,是内置的控制器基类,控制器中的每个公共方法都统称为一个操作方法,可以通过某个URL从Web调用控制器执行操作
  5. MVC约定将控制器放在项目创建时默认的文件夹Controllers

ASP.NET MVC 控制器样例

  1. 新建一个ASP.NET WEB应用程序.名为MVCControllerDemo,并选择添加了MVC引用的空模板
  2. 通过在解决方案资源管理器 中右键单击 Controllers 文件夹来添加一个:EmployeeController的控制器
  3. 在Controllers 文件夹中看到一个新的 C# 文件 - EmployeeController.cs文件内容如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCControllerDemo.Controllers
{
    public class EmployeeController : Controller
    {
        // GET: Employee
        public ActionResult Index()
        {
            return View();
        }
    }
}

ASP.NET MVC自定义路由规则

  1. 使用默认路由为EmployeeController控制器,需要添加一个默认的路由

第一步

  1. :在App-Start文件夹的RouteConfig.cs文件中,添加下面的路由
routes.MapRoute(
   "Employee", "Employee/{name}", new{
      controller = "Employee", action = "Search", name =
      UrlParameter.Optional });
  1. 完整的RouteConfig.cs文件的完整实现如下
using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MVCControllerDemo {
   public class RouteConfig {
      public static void RegisterRoutes(RouteCollection routes){
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
         routes.MapRoute(
            "Employee", "Employee/{name}", new{
               controller = "Employee", action = "Search", name = UrlParameter.Optional });

         routes.MapRoute(
            name: "Default", url: "{controller}/{action}/{id}", defaults: new{
               controller = "Home", action = "Index", id = UrlParameter.Optional });
      }
   }
}
  1. 我们添加自定义路由的目的是为了让任何用户来到后都能进行Search动作,指定的URLEmployye/Maxsu,在这种情况下,Maxsu将被视为参数名称,而不是操作的方法。所以在这种情况下,默认路由将不会工作显示。
  2. 当参数传递时,要从浏览器获取传入值,MVC框架通过操作方法内部的参数解决获取传入值的问题

第二步:更改EmployeeController的内容,如下所示

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCControllerDemo.Controllers
{
    public class EmployeeController : Controller
    {
        // GET: Employee       
        public ActionResult Search(string name)
        {
            var input = Server.htmlEncode(name);
            return Content(input);
        }
    }
}
  1. 如果将一个添加到操作方法中,则MVC框架将查找与参数名称匹配的值
  2. MVC框架将应用所有可能的组合找出参数值,MVC将搜索路由数据,查询字符串等
  3. 如果请求:/Employee/Maxsu,MVC框架将决定需要一个带有UserInput的参数,然后Maxsu会从url中挑选出来并自动传递
  4. Server.HtmlEncode将简单的转换任何形式的纯文本恶意脚本
  5. URL:http://localhost:51066/Employee/Maxsu时, 将会在页面上的Maxsu

ASP.NET MVC动作

  1. ASP.NET MVC操作方法负责执行请求并生成响应,默认情况下MVC操作方法以ActionResult的形式生成响应,操作动作通常具有与用户交互的一对一映射
  2. 例如:在浏览器中输入URL,点击任何特定链接,提交表单等,用户交互中的每一个动作都会导致请求被发送到服务器,在这种情况下,请求的URL都包含MVC框架用来调用操作方法的信息
  3. 动作方法的限制是动作方法必须是实例方法,动作方法不能是静态方法,也没有返回值的限制,所有可返回字符串,整数等

请求处理

  1. 动作是MVC应用程序的最终目标,动作使用控制器基类,使用请求处理的过程如下
  2. 当URL到达时,如/Home/index,这是UrlRoutingModule,检查并理解路由表中配置的内容,以及如何处理该URL
  3. UrlRoutingModule将在路由表中配置的信息放在一起,并叫那个控制交给MVC路由处理程序
  4. MVC路由处理程序将控制器传递给作为HTTP处理程序的MvcHandler
  5. MvcHandler使用一个控制器工厂实例化控制器,MvcHandler知道实例化哪个个控制器,MvcHandler在该控制器值的RouteData中查找
  6. MvcHandler有一个控制器,MvcHandler唯一知道的就是IController接口,所以MvcHandler指示告诉控制器执行
  7. MvcHandler 告诉控制器执行时,是从MVC的控制器基类派生的,Execute方法创建一个动作调用者,并告诉动作调用者去找一个方法去调用,找到调用的动作
  8. 动作的调用者再次从RouteData中查找并找到从路由引擎传递的动作参数

动作类型

  1. 动作基本上返回不同类型的动作,ActionResult类是所有操作结果的基础
  2. 不同种类的行为结果及其行为的列表如下所示
  3. ContentResult:返回一个字符串
  4. FilePathResult:返回文件内容
  5. FilePathResult:返回文件路径
  6. FileStreamResult:返回文件内容
  7. EmptyResult:什么都不返回
  8. javascriptResult:返回脚本执行
  9. RedirectToResult;重定向到指定的网址
  10. HttpUnauthorizedResult:返回403HTTP状态码
  11. RedirectToRouteResult:重定向到不同的动作/不同的控制器动作
  12. ViewResult:作为视图引擎的响应收到
  13. PartialViewResult:作为视图引擎的响应收到

ASP.NET MVC 动作样例

第一步:EmployeeController控制器中的内容

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCControllerDemo.Controllers {
   public class EmployeeController : Controller{
      // GET: Employee
      public ActionResult Search(string name){
         var input = Server.HtmlEncode(name);
         return Content(input);
      }
   }
}


第二步:添加名为CustomerController的控制器和HomeController的控制器
第三步:修改HomeController控制器的内容

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCControllerDemo.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public string Index()
        {
            return "这是我的HomeController控制器的内容";
        }
    }
}

第四步:运行创建的ASP.NET MVC程序,出现如下界面


第五步:在创建的CustomerController控制器中添加如下方法

 public string GetAllCustomers()
        {
            return @"<ul>
                      <li>1</li>
                      <li>2</li>
                      <li>3</li>
                      <li>4</li>
                   </ul>";
        }

第六步;运行应用程序并请求URLhttp://localhost:49297/Customer/GetAllCustomers,看到以下输出

也可重定向到同一控制器的操作,甚至是不同的控制器,
将通过使用以下代码更改HomeController中的代码,从HomeController重定向到CustomerControllerusing

System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCControllerDemo.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            return RedirectToAction("GetAllCustomers", "Customer");
            //使用了RedirectToAction()方法,它有两个参数:操作名称和控制器名称
        }
    }
}

当运行这个应用程序时,会看到默认路由将重定向到/Customer/GetAllCustomers

ASP.NET MVC 过滤器

  1. 在ASP.NET MVC中,控制器定义的操作方法通常与可能的用户交互具有一对一的关系,但是有时候希望在调用操作方法之前或者在操作方法运行之后执行逻辑
  2. 所以ASP.NET MVC提供了过滤器,过滤器是一个自定义的类,
  3. 过滤器提供了一种声明和程序式的方法,可以将操作前和操作后的行为添加到控制器操作方法中

ASP.NET MVC 动作过滤器

  1. 动作过滤器是一个属性,可以将动作过滤器应用于控制动作或整个控制器,以修改执行动作的方式,

ASP.NET MVC 框架包括以下几个操作过滤器

  1. OutputCache - 将控制器操作的输出缓存指定的时间量
  2. HandleError - 处理执行控制器操作时引发的错误
  3. Authorize - 是能够限制对特定用户或角色的访问

ASP.NET MVC 过滤器的类型

ASP.NET MVC框架支持四种不同类型的过滤器

  1. 授权过滤器-实现IAuthorizationFilter属性
  2. 动作过滤器-实现IActionFilter属性
  3. 结果过滤器-实现IResultFilter属性
  4. 异常过滤器-实现IExceptionFilter属性
  5. 过滤器按照上面列出的顺序执行,例如,授权过滤器始终在动作过滤器和异常过滤器之前执行
  6. 授权过滤器用于实现控制器操作的身份验证和授权

ASP.NET MVC 应用操作筛选器

  1. 创建一个名为MVCFiltersDemo的应用项目,并添加名为HomeController的控制器
  2. 动作过滤器可以应用于单独的控制器动作或整个控制器,
  3. 例如,操作筛选器OutputCache应用于名为Index()的操作,该操作返回字符串。 此过滤器会将该操作返回的值缓存15秒
  4. 修改HomeController的控制器类,改变Index操作方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCFiltersDemo.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        [OutputCache(Duration = 15)]
        public string Index()
        {
            return "应用筛选过滤器";
        }
        // 返回当前时间
        [OutputCache(Duration = 20)]
        public string GetCurrentTime()
        {
            return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        }
        // 如果刷新浏览器,则会看到相同的时间,因为该操作被缓存了20秒。 20秒后刷新它将被更新

    }
}

ASP.NET MVC 自定义过滤器

  1. 要创建自己的自定义过滤器,ASP.NET MVC框架提供了名为ActionFilterAttribute的基类,此类实现了IActionFilterIResultFilter接口,都是从Filter类派生的
  2. 在项目中创建一个新的文件夹: ActionFilters。添加一个类,右键单击ActionFilters文件夹并选择:添加 -> 类 ,名为MyLogActionFilter,并且让MyLogActionFilter继承ActionFilterAttribute类,
  3. MyLogActionFilter内容如下
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MVCFiltersDemo.ActionFilters
{
    public class MyLogActionFilter : ActionFilterAttribute
    {

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            Log("初始化", filterContext.RouteData);
        }

        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            Log("执行11", filterContext.RouteData);
        }

        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            Log("已经加载", filterContext.RouteData);
        }

        private void Log(string methodName, RouteData routeData)
        {
            var controllerName = routeData.Values["controller"];
            var actionName = routeData.Values["action"];

            var message = String.Format(
               "{0} controller:{1} action:{2}", methodName, controllerName, actionName);
            System.Console.WriteLine("自定义的分隔符");
            Debug.WriteLine(message, "自定义过滤器日志");
        }
    }
}

使用以下代码将日志过滤器应用于HomeController控制器。

using MVCFiltersDemo.ActionFilters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCFiltersDemo.Controllers
{
    [MyLogActionFilter]
    public class HomeController : Controller
    {
        // GET: Home
        [OutputCache(Duration = 10)]
        public string Index()
        {
            return "自定义的过滤器中的homeConr";
        }

        // 返回当前时间
        [OutputCache(Duration = 10)]
        public string GetCurrentTime()
        {
            return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        }
    }
}

打开项目中的App_Start,打开文件FilterConfig.cs,添加以下代码注册过滤器:MyLogActionFilter

using MVCFiltersDemo.ActionFilters;
using System.Web;
using System.Web.Mvc;

namespace MVCFiltersDemo
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
            // 注册自定义Action过滤器:优先级最低,但是可以作用到所有的控制器和Action  
            filters.Add(new MyLogActionFilter());
        }
    }
}

运行应用程序,然后观察输出窗口,处理动作的每个阶段都有被记录到Visual Studio输出窗口中了。

ASP.NET MVC 选择器

  1. 动作选择器时可以应用于动作方法的属性,用于影响响应请求时调用哪个动作方法
  2. 动作选择器有助于路由引起选择正确的操作方法去处理特定的请求
  3. 当编写动作方法时,动作选择器将依据动作方法前面给出的修改后的名称决定方法的调用行为
  4. 动作选择器通常用于别名操作方法的名称

ASP.NET MVC 选择器的三种类型的属性

第一种属性:ActionName属性

  1. 表示一个用于动作名称的属性,允许开发人员使用与方法名称不同的动作名称(即动作的别名)
    创建MVCSelectors,创建一个控制器 - HomeController
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCSelectors.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public string Index()
        {
            return "自定义的HomeController";
        }

        public string GetCurrentTime()
        {
            return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        }
    }
}

通过在GetCurrentTime()方法之上写[ActionName("CurrentTime")]来应用GetCurrentTime的ActionName选择器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCSelectors.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public string Index()
        {
            return "自定义的HomeController";
        }

        [ActionName("CurrentTime")]
        public string GetCurrentTime()
        {
            return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        }
    }
}

运行该应用程序并在浏览器URL/Home/CurrentTime(不是GetCurrentTime),将收到以下输出结果 -
可以看到已经使用了CurrentTime,而不是原来的动作名称,在上面正常的URL应该是:GetCurrentTime。

第二种属性:NonAction

  1. NonAction是另一个内置属性,它表示Controller的公共方法不是一个操作方法。当想要一个方法不要被当作一个操作方法来处理的时候,就可以使用它了。
  2. HomeController中添加另一个方法,并使用下面的代码应用NonAction属性。
		[ActionName("CurrentTime")]
        public string GetCurrentTime()
        {
            return TimeString();
        }

		[NonAction]
        public string TimeString()
        {
            return "当前时间是: " + DateTime.Now.ToString("T");
        }
  1. 新的方法TimeString()是要被GetCurrentTime()方法调用的,但不能在URL中作为动作使用。
  2. 运行这个应用程序,并在浏览器中指定以下URL: http://localhost:62466/Home/CurrentTime
  3. 在URL中使用/Home/TimeString作为动作

第三种属性:ActionVerbs

  1. ActionVerbs属性,限制了特定行为对特定的HttpVerbs的指示
  2. 可以定义两个具有相同名称的不同操作方法,但是一个操作方法会响应HTTP Get请求,另一个操作方法会响应Http Post请求
  3. MVC框架支持HttpGet,HttpPost,HttpPut,HttpDelete,HttpOptions,HttpPatch
  4. 创建一个控制器EmployeeController
using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;


namespace MVCSelectors.Controllers
{
    public class EmployeeController : Controller
    {
        // GET: Employee
        public ActionResult Search(string name = "No name Entered")
        {
            var input = Server.HtmlEncode(name);
            return Content(input);
        }
    }
}
  1. 现在使用下面的代码添加另一个具有相同名称的操作方法。
using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;


namespace MVCSelectors.Controllers
{
    public class EmployeeController : Controller
    {
        public ActionResult Search(string name)
        {
            var input = Server.HtmlEncode(name);
            return Content(input);
        }

        public ActionResult Search()
        {
            var input = "Another Search action";
            return Content(input);
        }
    }
}

当运行这个应用程序时,它会给出一个错误,因为MVC框架无法确定应该为请求选择哪个操作方法。

使用下面的代码来指定HttpGet ActionVerb作为响应的动作。

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;


namespace MVCSelectors.Controllers
{
    public class EmployeeController : Controller
    {
        public ActionResult Search(string name)
        {
            var input = Server.HtmlEncode(name);
            return Content(input);
        }
        [HttpGet]
        public ActionResult Search()
        {
            var input = "Another Search action";
            return Content(input);
        }
    }
}

ASP.NET MVC 视图

  1. 在ASP.NET MVC 应用程序中,当在URL中指定路径是,可以想页面那样但不包含对应的任何内容直接显示给用户
  2. 在ASP.NET MVC中,最接近页面的东西就是视图
  3. 所有传入的浏览器请求都由控制器处理,并将这些请求映射到控制器操作,控制器可能会返回一个视图,或者也可能执行一些其他类型的操作,例如重定向到另一个控制器动作

第一步:创建名为MVCViewDemo的项目。
第二步:添加一个控件器:HomeController修改更新HomeController.cs文件中的代码,其中包含两个操作方法,如下面的代码所示

using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Mvc;

namespace MVCViewDemo.Controllers {
   public class HomeController : Controller{
      // GET: Home
      public ActionResult Index(){
         return View();
      }

      public string Mycontroller(){
         return "Hi, I am a controller";
      }
   }
}

运行http://localhost:57966/Home/MyController

由于 MyController操作只是返回字符串,要从操作返回一个View,需要首先添加一个View

第一步:在添加在添加视图之前,添加另一个操作,它将返回一个默认视图。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCViewDemo.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            return View();
        }

        public string Mycontroller()
        {
            return "Hi, I am a controller";
        }
        // 新添加的视图
        public ActionResult MyView()
        {
            return View();
        }
    }
}

运行这个应用程序,并在浏览器的URL中添加http://localhost:63461/Home/MyView,输出报错
第2步 - 要添加一个视图,右键单击MyView动作(方法)并选择添加视图。新建的视图内容如下

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>MyView</title>
</head>
<body>
    <div> 
    </div>
</body>
</html>

第4步 - 使用以下代码在此视图中添加一些文本
第五步;运行该应用程序,并将打开浏览器访问URL:http://localhost:57966/Home/MyView

以上是关于ASP.NET MVC的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在使用 Asp.Net MVC ActionLink、RedirectToAction 等时包含片段标识符?

[Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作

ASP.NET MVC4.0+EF+LINQ+bui+网站+角色权限管理系统

asp.net页面实用代码片段

清除 ASP.net 中的按钮名称参数

ASP.NET开发实战——ASP.NET MVC & 分层 代码篇