ASP.NET MVC5 学习笔记-1 控制器、路由、返回类型、选择器、过滤器

 

[TOC]

1. Action

1.1 新建项目

新建项目->Web->Asp.net Web应用程序,选择MVC,选择添加测试。

在解决方案上右键,选择"管理NuGet程序包",在更新页更新全部程序包。

1.2 控制器

控制器在Controllers文件夹内,命名规则是"名称+Controller"


2. 路由

2.1 路由规则

  1. {controller}/{action}/{id}

其中{id}是可选的。

2.2 路由定义RouteConfig.cs

  1. public class RouteConfig
  2. {
  3. public static void RegisterRoutes(RouteCollection routes)
  4. {
  5. routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  6. routes.MapRoute(
  7. name: "Default",
  8. url: "{controller}/{action}/{id}",
  9. defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  10. );
  11. }
  12. }

我们自定义一个路由:

  1. public static void RegisterRoutes(RouteCollection routes)
  2. {
  3. routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  4. routes.MapRoute(
  5. name: "Serial Number",
  6. url: "serial/{lettercase}",
  7. defaults: new { controller = "Home", action = "Serial", lettercase="upper" }
  8. );
  9. routes.MapRoute(
  10. name: "Default",
  11. url: "{controller}/{action}/{id}",
  12. defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  13. );
  14. }

它定义了一个路由,路由名称为"Serial Number", url以"serial"开头,含有一个lettercase参数,使用HomeController.Serial来处理,lettercase默认值为"upper".

现在在HomeController.cs中定义:

  1. public ActionResult Serial(string lettercase)
  2. {
  3. var serial = "ASP.NET mvc5";
  4. if (lettercase == "lower")
  5. {
  6. serial = serial.ToLower();
  7. }
  8. return Content(serial);
  9. }

此时访问:http://localhost:17681/serial/ 或者 http://localhost:17681/serial/lower 都可以。

如果路由中没有包含{lettercase},则可以使用querystring方式传递lettercase: http://localhost:17681/serial/?lettercase=lower:

  1. routes.MapRoute(
  2. name: "Serial Number",
  3. url: "serial",
  4. defaults: new { controller = "Home", action = "Serial" }
  5. );

vs快捷键:F5运行调试; ctrl+F5:运行但不调试,此时运行时可以修改代码;ctrl+shift+b:编译代码,可以在运行时重新加载而无需重启。

3 返回类型

内建Action Result类型:

  • ViewResult:渲染返回完整的网页
  • PartialViewResult:渲染返回网页的一部分,用于Ajax比较多;
  • ContentResult: 返回用户自定义的内容(text,xml)等;
  • JsonResult: 返回Json类型
  • RedirectToRouteResult:重定向

3.1 PartialViewResult的例子

  1. public ActionResult Index()
  2. {
  3. return PartialView();
  4. }

3.2 JsonResult的例子

  1. public ActionResult Serial(string lettercase)
  2. {
  3. var serial = "ASP.NET mvc5";
  4. if (lettercase == "lower")
  5. {
  6. serial = serial.ToLower();
  7. }
  8. //return Content(serial);
  9. return Json(new {name = "serial", value = serial}, JsonRequestBehavior.AllowGet);
  10. }

3.3 RedirectToRouteResult的例子

  1. public ActionResult Serial(string lettercase)
  2. {
  3. var serial = "ASP.NET mvc5";
  4. if (lettercase == "lower")
  5. {
  6. serial = serial.ToLower();
  7. }
  8. return RedirectToAction("Index");
  9. }

4 Action Selector

4.1 HttpPost

  1. public ActionResult Contact()
  2. {
  3. ViewBag.TheMessage = "有问题的话请留言哦~";
  4. return View();
  5. }
  6. [HttpPost]
  7. public ActionResult Contact(string message)
  8. {
  9. ViewBag.TheMessage = "感谢你的留言~";
  10. return View();
  11. }

对应的视图

  1. <form method="POST">
  2. <input type="text" name="message"/>
  3. <input type="submit"/>
  4. </form>

4.1.1 防止CSRF,使用ValidateAntiForgeryToken

  1. [HttpPost]
  2. [ValidateAntiForgeryToken]
  3. public ActionResult Create([Bind(Include = "ID,Title,ReleaseDate,Genre,Price")] Movie movie)
  4. {
  5. if (ModelState.IsValid)
  6. {
  7. db.Movies.Add(movie);
  8. db.SaveChanges();
  9. return RedirectToAction("Index");
  10. }
  11. return View(movie);
  12. }

对应的视图使用@Html.AntiForgeryToken

  1. @using (Html.BeginForm())
  2. {
  3. @Html.AntiForgeryToken()
  4. <div class="form-horizontal">
  5. <h4>Movie</h4>
  6. <hr />
  7. @Html.ValidationSummary(true, "", new { @class = "text-danger" })
  8. <div class="form-group">
  9. @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
  10. <div class="col-md-10">
  11. @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
  12. @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
  13. </div>
  14. </div>

4.1.2 验证Post请求 ModelState.IsValid

使用ModelState.IsValid来验证发送来的模型是否正常。

  1. [HttpPost]
  2. [ValidateAntiForgeryToken]
  3. public ActionResult Edit([Bind(Include="ID,Title,ReleaseDate,Genre,Price")] Movie movie)
  4. {
  5. if (ModelState.IsValid)
  6. {
  7. db.Entry(movie).State = EntityState.Modified;
  8. db.SaveChanges();
  9. return RedirectToAction("Index");
  10. }
  11. return View(movie);
  12. }

4.2 ActionName

  1. [ActionName("about-the-site")]
  2. public ActionResult About()
  3. {
  4. ViewBag.Message = "Your application description page.";
  5. return View("About");
  6. }

此时访问地址就是http://localhost:17681/Home/about-the-site

4.3 Route

  1. [Route("home/create")]
  2. public ActionResult Create()
  3. {
  4. }

5. 过滤器

常见的过滤器

5.1 Authorize属性

  1. [Authorize(Roles="administrator", Users="liulx")]
  2. [HttpPost]
  3. public ActionResult Create(Customer customer)
  4. {
  5. db.Customers.Add(customer);
  6. db.SaveChanges();
  7. return RedirectToAction("Index");
  8. }

Authorize可以不带参数,修饰class,如果class是Authorize修饰的,那么可以用[AllowAnonymous]修饰对应的方法允许匿名访问。

5.2 Action filter

创建自定义的Action Filter:

  • 继承ActionFilterAttribute
  • 重写OnActionExecuting方法,该方法在Action之前执行
  • 重写OnActionExecuted方法,该方法在Action之后执行
  1. public class MyLoggingFilterAttribute : ActionFilterAttribute
  2. {
  3. public override void OnActionExecuted(ActionExecutedContext filterContext)
  4. {
  5. var request = filterContext.HttpContext.Request;
  6. // Logger.logRequest(request.UserHostAddress);
  7. base.OnActionExecuted(filterContext);
  8. }
  9. }

调用

  1. [MyLoggingFilter]
  2. public ActionResult Index()
  3. {
  4. // throw new StackOverflowException();
  5. return View();
  6. }

要想在全局应用自定义的Filter,可以这样:

  1. public class FilterConfig
  2. {
  3. public static void RegisterGlobalFilters(GlobalFilterCollection filters)
  4. {
  5. //添加自定义Filter
  6. filters.Add(new MyLoggingFilterAttribute());
  7. filters.Add(new HandleErrorAttribute());
  8. }
  9. }

5.3 Result Filter

  1. [OutputCache(Duration=1800)]
  2. public ActionResult Index()
  3. {
  4. // throw new StackOverflowException();
  5. return View();
  6. }
  7. [OutputCache(Duration=1800, VaryByParam="id")]
  8. public ActionResult Details(int id)
  9. {
  10. Product p = db.Products.Find(id);
  11. return View(p);
  12. }

5.4 Exception Filter

  1. [HandleError(View="MyError")]
  2. public ActionResult Index()
  3. {
  4. // throw new StackOverflowException();
  5. return View();
  6. }
  7. [HandleError(View="MyError2", ExceptionType=typeof(DivideByZeroException))]
  8. public ActionResult Details(int id)
  9. {
  10. Product p = db.Products.Find(id);
  11. return View(p);
  12. }
 
分类: ASP.NET
标签: ASP.NET MVC

MVC5控制器、路由、返回类型、选择器、过滤器的更多相关文章

  1. MVC控制器方法返回类型

    控制器公开控制器操作.操作是控制器上的方法,在浏览器的地址栏中输入特定 URL 时被调用.例如,假设要请求下面的 URL: http://localhost/Product/Index/3 在这种情况 ...

  2. MVC控制器常用方法返回类型

    控制器的常用方法 using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...

  3. ASP.NET MVC5 学习笔记-1 控制器、路由、返回类型、选择器、过滤器

    [TOC] 1. Action 1.1 新建项目 新建项目->Web->Asp.net Web应用程序,选择MVC,选择添加测试. 在解决方案上右键,选择"管理NuGet程序包& ...

  4. ASP.NET Core WebAPI控制器返回类型的最佳选项

    前言 从.NET Core 2.1版开始,到目前为止,控制器操作可以返回三种类型的WebApi响应.这三种类型都有自己的优点和缺点,但都缺乏满足REST和高可测性的选项. ASP.NET Core中可 ...

  5. Web API 方法的返回类型、格式器、过滤器

    一.Action方法的返回类型 a) 操作方法的返回类型有四种:void.简单或复杂类型.HttpResponseMessage类型.IHttpActionResult类型. b) 如果返回类型为vo ...

  6. 找到多个与名为“xxx”的控制器匹配的类型。如果为此请求(“{controller}/{action}/{id}”)提供服务的路由没有指定命名空间以搜索与此请求相匹配的控制器,则会发生这种情况。

    一次在建MVC 项目的进行开发的时候,因为后来想到了一个更好的项目名称,就把 Web项目的名称重命名 改了, 然后 程序集名称,默认命名空间,都改成新的了,刚建立的项目本身也不大,运行起来,总是报 & ...

  7. mvc5中重命名项目的名称后,出现"找到多个与名为“Home”的控制器匹配的类型"

    1.已把项目中所有的Webapplication1改为了MvcMovie,但是运行后,还是报错: 找到多个与名为“Home”的控制器匹配的类型 2.已重新生成解决方安,还是不行. 解决方法:把bin文 ...

  8. Spring 框架控制器类方法可用的参数与返回类型

    参数类型 Spring 有内建的 HTTP 消息转换器用于部分简单类型之间的转换 标准 Servlet 类型:HttpServletRequest, HttpServletResponse, Http ...

  9. MVC Action 返回类型

    https://www.cnblogs.com/xielong/p/5940535.html https://blog.csdn.net/WuLex/article/details/79008515 ...

随机推荐

  1. nginx 日志和监控

    原文地址:http://nginx.com/resources/admin-guide/logging-and-monitoring/ Logging and Monitoring 日志和监控 Thi ...

  2. java注意事项演示 地图产生表 演示样本 来自thinking in java 4 20代码的章

    java注意事项演示 地图产生表 演示样本  来自thinking in java 4 20代码的章 thinking in java 4免费下载:http://download.csdn.net/d ...

  3. POJ 3280 Cheapest Palindrome (DP)

     Description Keeping track of all the cows can be a tricky task so Farmer John has installed a sys ...

  4. asp.net web api KnownTypeAttribute

    项目里用到了继承,在序列化的时候遇到了问题. 源代码 public class Segment { public SegmentType Type { get; set; } public strin ...

  5. sql推断时间

    SELECT * FROM msg_personchat_t WHERE send_userid='28' AND critime>'2014-03-30' AND critime<'20 ...

  6. Team Foundation Server 2015使用教程--默认团队权限说明

  7. Sizzle.selectors.relative [ 源代码分析 ]

    1 jQuery 对象Sizzle.selectors.relative中存放了块间关系符和相应的块间关系过滤函数,称为"块间关系过滤函数集" 块间关系符共同拥有4种,其含义和过滤 ...

  8. Content://sms

    package com.example.sms; import android.app.Activity; import android.app.Notification; import androi ...

  9. [模拟] hdu 4452 Running Rabbits

    意甲冠军: 两个人在一个人(1,1),一个人(N,N) 要人人搬家每秒的速度v.而一个s代表移动s左转方向秒 特别值得注意的是假设壁,反弹.改变方向 例如,在(1,1),采取的一个步骤,以左(1,0) ...

  10. UVA315- Network(无向图割点)

    题目链接 题意: 给出一张无向图,求割点的个数 思路:非常裸的题目.直接套用模版就可以. 代码: #include <iostream> #include <cstdio> # ...