一.前言
许久之后终于可以继续我的ASP.NET MVC连载了,之前我们全面的讲述了路由相关的知识,下面我们将开始控制器和动作的讲解。
二.正文
1.IController的使用
这个接口可能很多人都没有使用过,但是我们常用的Controller类实现了这个接口,而且只要实现这个接口就可以作为一个控制器,当然很多的内部的处理就要我们自己去做了。
下面我利用IController实现根据路由参数调用不同的方法:
public class HomeController : IController
{
public String Index()
{
return "<h1>Index</h1>";
} public String Show()
{
return "<h1>Show</h1>";
} public String Home()
{
return "<h1>Home</h1>";
} public void Execute(System.Web.Routing.RequestContext requestContext)
{
string action = requestContext.RouteData.Values["action"].ToString();
Type t = typeof(HomeController);
MethodInfo mi = t.GetMethod(action, BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
if (mi == null)
{
requestContext.HttpContext.Response.Write("<h1>404</h1>");
}
else
{
string s = mi.Invoke(this, null).ToString();
requestContext.HttpContext.Response.Write(s);
}
}
}
首先我们实现IController接口的Execute方法,然后在外面定义几个我们需要调用的方法,然后在Execute方法中获取action的参数,并通过反射技术获取对应的方法,如果能够获取到该方法则调用该方法并返回,否则返回404。
上面仅仅只是简单的列子,而且大多数时候我们并不需要实现IControler接口。
2.成熟的Controller
前面我们可以发现如果我们利用IController去实现控制器会非常的麻烦,但是实际上我们最终都是使用的是Controller类,
它已经实现了很多功能,这样我们就可以关注于功能而不是底层的实现。有过ASP.NET开发的人一定知道,很多数据都是使
用Request.QueryString,RouteData来获取的。
但是在ASP.NET MVC中可以更简便的获取,比如下面的代码:
public class UserController : Controller
{ public ActionResult Index(string path)
{
ViewBag.Path1 = path;
return View();
} }
上面的代码仅仅只是简单的将传入的path属性存到视图包中以便页面输出。
(首先我们还要新建对应的视图页面,页面的代码如下)
<h2>@ViewBag.Path1</h2>
@using (Html.BeginForm())
{
@Html.Editor("path")
<input type="submit" value="submit" />
}
下面我们通过这个路径访问页面:http://localhost:1201/User/Index?path=12
那么最终的页面就会如下所示:
我们可以看到uri中存在了path属性的值所以后台的path就是12,所以页面上输出是12,细心的人会发觉input里面显示的值也会跟着uri中path变化。
上面我们仅仅是通过uri改变呢,下面是通过form表单来传递path的值,我们在input中输入一个值,然后点击submit,我们可以看到如下的结果:
这里我们可以看到当我们的输入框的值是什么,最后页面输出的值也是这个输入的值。
3.动作结果
无论控制器如何的强大不能生成用户希望的页面,一样也会毫无用武之地。下面我们就是要学习几种动作结果:
A.View
这个动作结果,很多人都不会陌生,因为一创建控制器之后都会有一个默认的Index动作其中就是返回View,但是这里你要知道如果直接返回View那么对应的视图文件会按照Views/控制器名/动作名.cshtml去查找,
当然如果找不到还会对其他公共页面进行搜索,但是我们还可以自行指定:
首先我们在Views/User/下新建一个SubIndex.cshtml视图,然后修改UserController中的Index方法代码:
public ActionResult Index()
{
return View("SubIndex");
}
这里我们可以看到我们直接将视图的名称作为参数传递给View,但这些仅仅只是控制显示的视图,我们最终还需要将控制器中的数据传递到视图,
供视图去显示,这里我们可以介绍四种方式,ViewBag,ViewData,TempData,Model,下面我们用一段代码来演示下:
public class UserController : Controller
{ public ActionResult Index()
{
ViewBag.Show = "From ViewBag";
ViewData["Show"] = "From ViewBag";
TempData["Show"] = "From TempData";
object obj = "From Model";
return View(obj);
} }
这里我们在各种传递方式中赋值,下面就是对应的视图:
<h2>@ViewBag.Show</h2>
<h2>@ViewData["Show"].ToString()</h2>
<h2>@TempData["Show"].ToString()</h2>
<h2>@Model</h2>
然后我们重新编译,刷新页面之后最终结果如下:
这里有一个要稍微介绍下,就是TempData,其实它主要是用来将数据传递到其他页面的,所以他有一些特性,就是当从中读取了数据之后就会将该数据从中清除,除非使用Peek方法读取,那么该数据就不会被标记为删除,
如果想刻意的将某个数据去除删除标记,可以使用Keep方法。相关的示例这里我就不列举了。
B.重定向
既然是开发网站,既然就会有跳转页面的功能,下面我们就会集中讲述ASP.NET MVC中提供的重定向功能。
首先是最简单的重定向,就是直接根据我们提供的路径跳转:
public class UserController : Controller
{
public ActionResult Index()
{
return Redirect("/Home/Index");
}
}
这里我们可以看到Redirect中我们直接传进了Home控制器额Index动作的路由路径,我们打开这页面就可以发现进行了跳转。
如果你学会HTTP一定会知道重定向中还有一个叫永久重定向,如果我们需要使用的话,可以利用RedirectPermanent方法。
通过上面我们看到这样需要输入完整的路径,当然ASP.NET MVC已经提供给我们其他的快捷的方式,比如下面的这种方式:
(我们需要在UserController中添加Show动作,同时添加对应的视图)
public class UserController : Controller
{
public ActionResult Index()
{
return RedirectToAction("Show");
} public ActionResult Show()
{
return View();
}
}
这里我们看到RedirectToAction中传入了Show,其实这里就代表这个重定向会跳转到Show动作中,如果需要永远重定向可以使用RedirectToActionPermanent方法。
但有时我们需要更加灵活的方式去重定向,那么我们就可以使用下面的方式:
public ActionResult Index()
{
return RedirectToRoute(new { controller = "Home", action = "Index" });
}
这里我们是直接通过传递构成该请求的控制器参数,动作参数构成最终的路由,当然我们也可以传递其他额外的参数到其中,
如果需要永远重定向则使用RedirectToRoutePermanent方法。
C.其他
这里我们不每个去举例了,下面是其他的动作结果:
Json : 将c#类转换成json格式
Javascript : 传递javascript代码
Content : 传递其他格式的字符数据
File : 传递文件流
HttpNotFoound : 404错误
由于最近忙于测试,所以没有时间去写随笔了,这篇随笔是利用下班在家每天写一些最后写出来的。当然水平上没有前两篇那么细腻了。
ASP.NET MVC学习之控制器篇的更多相关文章
-
ASP.NET MVC学习之控制器篇扩展性
原文:ASP.NET MVC学习之控制器篇扩展性 一.前言 在之前的一篇随笔中已经讲述过控制器,而今天的随笔是作为之前的扩展. 二.正文 1.自定义动作方法 相信大家在开发过程一定会遇到动作方法的重名 ...
-
ASP.NET MVC学习之控制器篇(二)
原文链接:http://www.asp.net/learn/mvc/ 这篇教程探索了ASP.NET MVC控制器(controller).控制器动作(controller action)和动作结果(a ...
-
ASP.NET MVC学习之过滤器篇(2)
下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...
-
ASP.NET MVC学习之视图篇(2)
继ASP.NET MVC学习之视图(1)学习 4.HTML辅助器 虽然在ASP.NET MVC中我们已经摆脱了ASP.NET的控件,但是对于页面中需要循环标签的情况依然还是存在,可能很多人认为用for ...
-
ASP.NET MVC学习之过滤器篇(1)
一.前言 继前面四篇ASP.NET MVC的随笔,我们继续向下学习.上一节我们学习了关于控制器的使用,本节我们将要学习如何使用过滤器控制用户访问页面. 二.正文 以下的示例建立在ASP.NET MVC ...
-
ASP.NET MVC学习之视图篇(1)
一.前言 不知道还有多少读者从第一篇开始一直学习到如今,笔者也会一直坚持将ASP.NET MVC的学习完美的结束掉,然后开始写如何配合其他框架使用ASP.NET MVC的随笔.当然笔者后面的随笔如果没 ...
-
ASP.NET MVC学习之路由篇(3)
根据路由输出链接 既然是网站开发自然少不了链接,我们已经学会了强大的路由,但是还缺少一步就是能够将这些路由的路径输出到页面,下面我们就开始学习如何输出路由路径. 首先我们的路由注册部分如下所示: 1 ...
-
ASP.NET MVC学习之路由篇(2)
7.解决与物理路径的冲突 当发送一个请求至ASP.NET MVC时,其实会检查网站中存不存在这个请求的物理路径文件,如果存在的话,就会直接将这个物理文件返回.但是有时候我们需要它执行控制器的某个方法, ...
-
ASP.NET MVC学习之路由篇(1)
1.基本路由 RouteConfig.cs: 1 public class RouteConfig 2 { 3 public static void RegisterRoutes(RouteColle ...
随机推荐
-
MySQL数据库初识(二)
8. 向数据表中插入数据记录(INSERT): 向数据表中插入数据记录有两种方法: 基本语法1:INSERT INTO 数据表 (字段名1,字段名2,字段名3……字段名n) VALUES (数据值1, ...
-
2016网易实习生编程题:n个骰子的和等于m
题目 骰子的点数是1 到 6,当有n个骰子的时候,其点数和等于m的数量 如当n = 4 m = 23时候 有下面四种: 5666656666566665 解题 深度优先,开始第一感觉很复杂,然后就没有 ...
-
LintCode-Compare Strings
Compare two strings A and B, determine whether A contains all of the characters in B. The characters ...
-
Bind Enum to ListControl
当使用MVVM时,相信你和我一样经常有这样的需求: 在ViewModel里定义了一个Enum,它必然是对应UI上的一个ListControl作为不同选项. 有一种做法是使用Converter,将Enu ...
-
HDOJ(HDU) 1859 最小长方形(水题、、)
Problem Description 给定一系列2维平面点的坐标(x, y),其中x和y均为整数,要求用一个最小的长方形框将所有点框在内.长方形框的边分别平行于x和y坐标轴,点落在边上也算是被框在内 ...
-
ubuntu软件中心崩溃
网上找了下别人的解决方法(本人測试成功解决此问题): 提示说是lists出错 我的正是这样的情况 使用例如以下命令能够修复: 1.删除lists sudo rm /var/lib/apt/lists/ ...
-
asp.net+jQueryRotate开发幸运大转盘
在线抽奖程序在很多网站上很多,抽奖形式多种多样,Flash抽奖偏多,本文将给大家介绍jQuery转盘抽奖,结合代码实例将使用jQuery和asp.net来实现转盘抽奖程序,为了便于理解,文章贴出实现源 ...
-
Supervisor管理进程
Supervisor管理进程 转载 2016年04月14日 18:26:45 标签: supervisord 28344 Supervisor重新加载配置启动新的进程 liaojie 发布于 1年前, ...
-
Xcode注释快捷键和Alfred 快捷键冲突解决方案
在Alfred 中的Features -> File Search ->Navigation ->Previous Path 中的快捷方式改掉就可以了
-
Python数据分析--Pandas知识点(一)
本文主要是总结学习pandas过程中用到的函数和方法, 在此记录, 防止遗忘 1. 重复值的处理 利用drop_duplicates()函数删除数据表中重复多余的记录, 比如删除重复多余的ID. im ...