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

摘要:
右键单击解决方案并选择“管理NuGet软件包”以更新更新页面上的所有软件包。如果路由不包含{lettercase},则可以使用querystring方法传递lettercase:http://localhost:17681/serial/?

目录

1. Action

1.1 新建项目

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

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

1.2 控制器

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


2. 路由

2.1 路由规则

{controller}/{action}/{id}

其中{id}是可选的。

2.2 路由定义RouteConfig.cs

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

我们自定义一个路由:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Serial Number",
        url: "serial/{lettercase}",
        defaults: new { controller = "Home", action = "Serial", lettercase="upper" }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

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

现在在HomeController.cs中定义:

public ActionResult Serial(string lettercase)
{
    var serial = "ASP.NET mvc5";
    if (lettercase == "lower")
    {
        serial = serial.ToLower();
    }
    return Content(serial);
}

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

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

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

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

3 返回类型

内建Action Result类型:

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

3.1 PartialViewResult的例子

public ActionResult Index()
{
    return PartialView();
}

3.2 JsonResult的例子

public ActionResult Serial(string lettercase)
{
    var serial = "ASP.NET mvc5";
    if (lettercase == "lower")
    {
        serial = serial.ToLower();
    }
    //return Content(serial);
    return Json(new {name = "serial", value = serial}, JsonRequestBehavior.AllowGet);
}

3.3 RedirectToRouteResult的例子

public ActionResult Serial(string lettercase)
{
    var serial = "ASP.NET mvc5";
    if (lettercase == "lower")
    {
        serial = serial.ToLower();
    }
    return RedirectToAction("Index");
}

4 Action Selector

4.1 HttpPost

public ActionResult Contact()
{
    ViewBag.TheMessage = "有问题的话请留言哦~";

    return View();
}

[HttpPost]
public ActionResult Contact(string message)
{
    ViewBag.TheMessage = "感谢你的留言~";

    return View();
}

对应的视图

<form method="POST">
    <input type="text" name="message"/>
    <input type="submit"/>
</form>

4.1.1 防止CSRF,使用ValidateAntiForgeryToken

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,Title,ReleaseDate,Genre,Price")] Movie movie)
{
    if (ModelState.IsValid)
    {
        db.Movies.Add(movie);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(movie);
}

对应的视图使用@Html.AntiForgeryToken

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()
    
    <div class="form-horizontal">
        <h4>Movie</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @  })
        <div class="form-group">
            @Html.LabelFor(model => model.Title, htmlAttributes: new { @  })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @  } })
                @Html.ValidationMessageFor(model => model.Title, "", new { @  })
            </div>
        </div>

4.1.2 验证Post请求 ModelState.IsValid

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

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include="ID,Title,ReleaseDate,Genre,Price")] Movie movie)
{
    if (ModelState.IsValid)
    {
        db.Entry(movie).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(movie);
}

4.2 ActionName

[ActionName("about-the-site")]
public ActionResult About()
{
    ViewBag.Message = "Your application description page.";

    return View("About");
}

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

4.3 Route

[Route("home/create")]
public ActionResult Create()
{
	
}

5. 过滤器

常见的过滤器

5.1 Authorize属性

[Authorize(Roles="administrator", Users="liulx")]
[HttpPost]
public ActionResult Create(Customer customer)
{
	db.Customers.Add(customer);
	db.SaveChanges();
	return RedirectToAction("Index");
}

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

5.2 Action filter

创建自定义的Action Filter:

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

调用

[MyLoggingFilter]
public ActionResult Index()
{
    // throw new StackOverflowException();
    return View();
}

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

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
    	//添加自定义Filter
        filters.Add(new MyLoggingFilterAttribute());
        filters.Add(new HandleErrorAttribute());
    }
}

5.3 Result Filter

[OutputCache(Duration=1800)]
public ActionResult Index()
{
    // throw new StackOverflowException();
    return View();
}

[OutputCache(Duration=1800, VaryByParam="id")]
public ActionResult Details(int id)
{
    Product p = db.Products.Find(id);
    return View(p);
}

5.4 Exception Filter

[HandleError(View="MyError")]
public ActionResult Index()
{
    // throw new StackOverflowException();
    return View();
}

[HandleError(View="MyError2", ExceptionType=typeof(DivideByZeroException))]
public ActionResult Details(int id)
{
    Product p = db.Products.Find(id);
    return View(p);
}

免责声明:文章转载自《ASP.NET MVC5 学习笔记-1 控制器、路由、返回类型、选择器、过滤器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇对Xml文档进行操作(修改,删除)最简单的Android项目下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue-router路由跳转,实现target: _blank,单独打开一个标签页

1,编程式路由跳转 let { href } = this.$router.resolve({ path: '/help-center' }) window.open(href, '_blank') 2,页面标签跳转 <div class="item-fore7 cur">注册即代表同意 <router-link ta...

消息队列之

      对于消息队列,应该都不陌生。市场上很多类型的消息队列,五花八门。选择自己适合场景的消息队列并不容易。如何选择呢?这篇文章不会很简单的对比所有的队列的优劣,会从消息队列的本身的方式与优缺点,让大家觉得需不需要使用消息队列。   消息队列的架构模式       消息代理定义:消息代理是一种架构模式,用于消息验证、变换、路由。调节应用程序的通信,...

.NET作品集:linux下的博客程序

博客程序架构 本博客程序是博主11年的时候参考loachs小泥鳅博客内核开发的.net跨平台博客cms,距今已有6年多了,个人博客网站一直在用,虽然没有wordpress那么强大,但是当时在深究.net的同时,自己能写一个博客程序,并且基于独立Linux服务器搭建一个自己的.net网站还是挺有意思,毕竟当年运行在linux下的.net网站还是极少数的,之前的...

使用蒲公英路由器 X3 设置为网络中继器

由于我的路由器放的时间比较久没有用了,所以先让路由器来个升级。链接图如下: 在浏览器地址栏中输入  oraybox.com,系统会自动跳到 https://pgybox.oray.com/passport/login 根据路由器背面的 SN + 初始密码 admin 顺利进入。画面如下图 要进行上网方式设置(继承其他wifi信号,也就是网络中继器的功能...

四: 使用vue搭建网站前端页面

---恢复内容开始--- 在搭建路由项目的时候的基本步骤 一:创建项目   安装好vue 搭好环境 (步骤在上篇博客中)   进入项目目录      cd   目录路径/ 目录名   创建项目          vue init webpack  项目名   效果:   项目文件结构:及作用    -- build...

RocketMQ多master迁移至多master多slave模式

一、项目背景 由于当前生产环境RocketMQ机器使用年限较长,已经过保,并且其中一台曾经发生过异常宕机事件。并且早期网络规划较乱,生产、开发、测试等网络没有分开,公司决定对当前网络进行规划,区分各个环境网段、机柜,涉及到MQ集群需要迁移,由于物理机比较老旧,使用决定使用新机器替换老机器,并且之前的MQ集群为多master模式,当master宕机是会导...