ASP.NET MVC
Posted 小企鹅推雪球!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET MVC相关的知识,希望对你有一定的参考价值。
文章目录
ASP.NET mvc控制器
- 控制器是ASP.NET MVC应用程序的中心单元,控制器是第一个请求接收者,与传入的HTPP请求进行交互,
- 控制器决定选择哪个模型,然后从模型中获取数据,并将数据传递给相应的视图,然后渲染视图
- 实际上,控制器控制应用程序的整体流程,并输出正确的输出
- 控制器继承自
System.Web.mvc.controller
的c#,是内置的控制器基类,控制器中的每个公共方法都统称为一个操作方法,可以通过某个URL从Web调用控制器执行操作 - MVC约定将控制器放在项目创建时默认的文件夹
Controllers
中
ASP.NET MVC 控制器样例
- 新建一个ASP.NET WEB应用程序.名为
MVCControllerDemo
,并选择添加了MVC
引用的空模板 - 通过在解决方案资源管理器 中右键单击 Controllers 文件夹来添加一个:
EmployeeController
的控制器 - 在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自定义路由规则
- 使用默认路由为
EmployeeController
控制器,需要添加一个默认的路由
第一步
- :在
App-Start
文件夹的RouteConfig.cs
文件中,添加下面的路由
routes.MapRoute(
"Employee", "Employee/{name}", new{
controller = "Employee", action = "Search", name =
UrlParameter.Optional });
- 完整的
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 });
}
}
}
- 我们添加自定义路由的目的是为了让任何用户来到后都能进行
Search
动作,指定的URL
为Employye/Maxsu
,在这种情况下,Maxsu将被视为参数名称,而不是操作的方法。所以在这种情况下,默认路由将不会工作显示。 - 当参数传递时,要从浏览器获取传入值,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);
}
}
}
- 如果将一个添加到操作方法中,则MVC框架将查找与参数名称匹配的值
- MVC框架将应用所有可能的组合找出参数值,MVC将搜索路由数据,查询字符串等
- 如果请求:
/Employee/Maxsu
,MVC框架将决定需要一个带有UserInput
的参数,然后Maxsu
会从url
中挑选出来并自动传递 Server.HtmlEncode
将简单的转换任何形式的纯文本恶意脚本- URL:
http://localhost:51066/Employee/Maxsu
时, 将会在页面上的Maxsu
ASP.NET MVC动作
- ASP.NET MVC操作方法负责执行请求并生成响应,默认情况下MVC操作方法以
ActionResult
的形式生成响应,操作动作通常具有与用户交互的一对一映射 - 例如:在浏览器中输入URL,点击任何特定链接,提交表单等,用户交互中的每一个动作都会导致请求被发送到服务器,在这种情况下,请求的URL都包含MVC框架用来调用操作方法的信息
- 动作方法的限制是动作方法必须是实例方法,动作方法不能是静态方法,也没有返回值的限制,所有可返回字符串,整数等
请求处理
- 动作是MVC应用程序的最终目标,动作使用控制器基类,使用请求处理的过程如下
- 当URL到达时,如
/Home/index
,这是UrlRoutingModule
,检查并理解路由表中配置的内容,以及如何处理该URL UrlRoutingModule
将在路由表中配置的信息放在一起,并叫那个控制交给MVC路由处理程序- MVC路由处理程序将控制器传递给作为HTTP处理程序的
MvcHandler
MvcHandler
使用一个控制器工厂实例化控制器,MvcHandler
知道实例化哪个个控制器,MvcHandler
在该控制器值的RouteData
中查找- 当
MvcHandler
有一个控制器,MvcHandler
唯一知道的就是IController
接口,所以MvcHandler
指示告诉控制器执行 - 当
MvcHandler
告诉控制器执行时,是从MVC
的控制器基类派生的,Execute方法
创建一个动作调用者,并告诉动作调用者去找一个方法去调用,找到调用的动作 - 动作的调用者再次从
RouteData
中查找并找到从路由引擎传递的动作参数
动作类型
- 动作基本上返回不同类型的动作,
ActionResult
类是所有操作结果的基础 - 不同种类的行为结果及其行为的列表如下所示
ContentResult
:返回一个字符串FilePathResult
:返回文件内容FilePathResult
:返回文件路径FileStreamResult
:返回文件内容EmptyResult
:什么都不返回javascriptResult
:返回脚本执行RedirectToResult
;重定向到指定的网址HttpUnauthorizedResult
:返回403HTTP状态码RedirectToRouteResult
:重定向到不同的动作/不同的控制器动作ViewResult
:作为视图引擎的响应收到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
重定向到CustomerController
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 ActionResult Index()
{
return RedirectToAction("GetAllCustomers", "Customer");
//使用了RedirectToAction()方法,它有两个参数:操作名称和控制器名称
}
}
}。
当运行这个应用程序时,会看到默认路由将重定向到/Customer/GetAllCustomers
ASP.NET MVC 过滤器
- 在ASP.NET MVC中,控制器定义的操作方法通常与可能的用户交互具有一对一的关系,但是有时候希望在调用操作方法之前或者在操作方法运行之后执行逻辑
- 所以ASP.NET MVC提供了过滤器,过滤器是一个自定义的类,
- 过滤器提供了一种声明和程序式的方法,可以将操作前和操作后的行为添加到控制器操作方法中
ASP.NET MVC 动作过滤器
- 动作过滤器是一个属性,可以将动作过滤器应用于控制动作或整个控制器,以修改执行动作的方式,
ASP.NET MVC 框架包括以下几个操作过滤器
OutputCache
- 将控制器操作的输出缓存指定的时间量HandleError
- 处理执行控制器操作时引发的错误Authorize
- 是能够限制对特定用户或角色的访问
ASP.NET MVC 过滤器的类型
ASP.NET MVC框架支持四种不同类型的过滤器
- 授权过滤器-实现
IAuthorizationFilter
属性 - 动作过滤器-实现
IActionFilter
属性 - 结果过滤器-实现
IResultFilter
属性 - 异常过滤器-实现
IExceptionFilter
属性 - 过滤器按照上面列出的顺序执行,例如,授权过滤器始终在动作过滤器和异常过滤器之前执行
- 授权过滤器用于实现控制器操作的身份验证和授权
ASP.NET MVC 应用操作筛选器
- 创建一个名为
MVCFiltersDemo
的应用项目,并添加名为HomeController
的控制器 - 动作过滤器可以应用于单独的控制器动作或整个控制器,
- 例如,操作筛选器
OutputCache
应用于名为Index()
的操作,该操作返回字符串。 此过滤器会将该操作返回的值缓存15秒 - 修改
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 自定义过滤器
- 要创建自己的自定义过滤器,ASP.NET MVC框架提供了名为
ActionFilterAttribute
的基类,此类实现了IActionFilter
和IResultFilter
接口,都是从Filter
类派生的 - 在项目中创建一个新的文件夹:
ActionFilters
。添加一个类,右键单击ActionFilters
文件夹并选择:添加 -> 类 ,名为MyLogActionFilter
,并且让MyLogActionFilter
继承ActionFilterAttribute
类, 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 选择器
- 动作选择器时可以应用于动作方法的属性,用于影响响应请求时调用哪个动作方法
- 动作选择器有助于路由引起选择正确的操作方法去处理特定的请求
- 当编写动作方法时,动作选择器将依据动作方法前面给出的修改后的名称决定方法的调用行为
- 动作选择器通常用于别名操作方法的名称
ASP.NET MVC 选择器的三种类型的属性
第一种属性:ActionName属性
- 表示一个用于动作名称的属性,允许开发人员使用与方法名称不同的动作名称(即动作的别名)
创建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
- NonAction是另一个内置属性,它表示
Controller
的公共方法不是一个操作方法。当想要一个方法不要被当作一个操作方法来处理的时候,就可以使用它了。 - 在
HomeController
中添加另一个方法,并使用下面的代码应用NonAction
属性。
[ActionName("CurrentTime")]
public string GetCurrentTime()
{
return TimeString();
}
[NonAction]
public string TimeString()
{
return "当前时间是: " + DateTime.Now.ToString("T");
}
- 新的方法TimeString()是要被
GetCurrentTime()
方法调用的,但不能在URL
中作为动作使用。 - 运行这个应用程序,并在浏览器中指定以下URL:
http://localhost:62466/Home/CurrentTime
- 在URL中使用
/Home/TimeString
作为动作
第三种属性:ActionVerbs
ActionVerbs
属性,限制了特定行为对特定的HttpVerbs
的指示- 可以定义两个具有相同名称的不同操作方法,但是一个操作方法会响应HTTP Get请求,另一个操作方法会响应
Http Post
请求 - MVC框架支持
HttpGet,HttpPost,HttpPut,HttpDelete,HttpOptions,HttpPatch
- 创建一个控制器
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);
}
}
}
- 现在使用下面的代码添加另一个具有相同名称的操作方法。
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 视图
- 在ASP.NET MVC 应用程序中,当在URL中指定路径是,可以想页面那样但不包含对应的任何内容直接显示给用户
- 在ASP.NET MVC中,最接近页面的东西就是视图
- 所有传入的浏览器请求都由控制器处理,并将这些请求映射到控制器操作,控制器可能会返回一个视图,或者也可能执行一些其他类型的操作,例如重定向到另一个控制器动作
第一步:创建名为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操作