ASP.NET 控制器和动作方法

1.什么样的类能成为控制器?

在ASP.NET MVC 中,直接或者间接地实现了IController接口的类,就会被Mvc框架认为是控制器。

using System.Web.Routing;
namespace System.Web.Mvc
{
    public interface IController
    {
        void Execute(RequestContext requestContext);
    }
}

从代码中,看到此接口有一个唯一的方法Execute,此方法会在请求到达控制器的时候被调用。
如果我们定义一个类实现直接实现此接口,也就意味着我们必须写大量的代码去处理请求。好在Mvc框架为我们定义一个Controller抽象类,我们直接可以此类派生,就可以获取到大量的处理请求的逻辑,我们只需要定义动作方法即可。

2.Mvc框架怎么知道需要用哪个控制器?

Mvc框架会从RouteData.Values中提取键为"controller"的值,这个值+“Controller”就组成了控制器的名称,也就是Mvc要找的那个控制器。

3. 控制器从哪些地方访问输入的数据?

主要是从三个地方: 1)通过上下文对象提取数据。 2)作为参数传给动作方法而形成的数据。3)明确的调用Mvc框架的模型绑定特性。

1)当我从Controller抽象类派生出自己的控制器时,我们就自动的得到了一批便利的属性,这些属性能够访问和请求相关的数据,这些对象有Request,Response,RouteData,HttpContext,Server.

2)① 使用动作方法参数,Mvc不允许动作方法有ref回out参数,Mvc遇到这个情况,就直接抛出异常。

② Mvc框架会帮我自动对动作方法进行赋值,而不需要我们手动检查上下文对象来赋值。 Mvc给动作方法赋值也是检查上下文对象来完成的。

这些上下文对象包括Request.QueryString,Request.Form和RouteData.Values。对参数的名称的处理是不区分大小的。比如动作方法的一个参数为city, 那么                       Request.QueryString[“city”]或者Request.QueryString[“City”]都可以。

③ 参数对象怎么实例化的?底层的Controller类使用了叫“值提供器”和“模型绑定”的组件来为动作方法获取参数值。

④ 在Mvc框架中;如果找不到一个引用类型的参数的值,动作方法还会调用。不过这个参数的值被设置为null,可以说引用类型的参数是可选的。

如果动作方法的参数的类型是值类型,Mvc找不到这个参数的值,就会抛出异常。可以说值类型的参数是必须的。想让值类型的参数变成可选,

有2种方法:其一让参数义成可空类型。或者给参数设置默认值。

⑤ 如果不想处理不含动作方法参数值得请求,但又不想在代码中检查null或者抛出异常,可以使用C#的一个可选参数特性来代替:为参数指定默认。

public ActionResult Index(string query="All",int page=1)
{
//其他代码
}

3.控制器是怎么产生输出的?

Mvc框架通过使用“动作结果(Action Result)”把指明意图和执行意图分开。我们不是直接使用Response对象,而是返回一个派生于ActionResult类的对象。这个对象描述了控制器响应要完成的功能。例如渲染一个视图或者重定向到另一个URL或者动作方法等。

Mvc框架从一个动作方法接受到一个ActionResult对象时,Mvc框架就会调用由这个类所定义的ExecuteResult方。r然后改动作结果的实现处理Response对象,生成符合你意图的输出。

Mvc框架中有许多的内置的动作结果类型,这些类型都是派生于ActionResult,其中有不少类型在Controller类中有便利的方法。

---------

Mvc框架查找视图位置的顺序:

(应用程序使用了区域就从此处开始查找视图)

/Areas/<AreaName>/Views/<controllerName>/<ViewName>.aspx

/Areas/<AreaName>/Views/<controllerName>/<ViewName>.ascx

/Areas/<AreaName>/Views/Shared/<ViewName>.aspx

/Areas/<AreaName>/Views/Shared/<ViewName>.ascx

/Areas/<AreaName>/Views/<controllerName>/<ViewName>.cshtml

/Areas/<AreaName>/Views/<controllerName>/<ViewName>.vbhtml

/Areas/<AreaName>/Views/Shared/<ViewName>.cshtml

/Areas/<AreaName>/Views/Shared/<ViewName>.vbhtml

(应用程序没有使用区域就从此处开始查找,或者使用了区域,但早上面没有找到视图,就会接着道下面的地方查找)

/Views/<controllerName>/<ViewName>.aspx

/Views/<controllerName>/<ViewName>.ascx

/Views/Shared/<ViewName>.aspx

/Views/Shared/<ViewName>.ascx

/Views/<controllerName>/<ViewName>.cshtml

/Views/<controllerName>/<ViewName>.vbhtml

/Views/Shared/<ViewName>.cshtml

/Views/Shared/<ViewName>.cshtml

(ControllerName):控制器名称名称去掉"Controller"字符串之后的字符串。

①Mvc框架只要在一个位置查找到了视图,就会停止查找动作,而这个找到的视图便被用来把响应渲染给客户端。

②Mvc框架搜索视图的目录序列是“约定优于配置”。不需要注册视图文件,只需要你把视图文件放在一组已知的位置中,Mvc框架便可以识别他们。

③视图的实际名称是根据RouteData.Value["action"]的值所确定的。

④我们可以为View方法提供一个明确的路径并绕过搜索阶段来完成指定指定的视图。在指定一个视图时候,路径必须以“~/”或者“/”开始,并且包含文件的扩展名。

---------

怎么把数据从动作方法传递给视图。

⑴ 给视图提供一个模型对象。

可以把一个对象作为View方法的参数发送给视图。

public ViewResult Index()
{
   DateTime dt=DateTime.Now;
   return View(dt);
}

这样我们可以再视图中使用Model关键字访问此对象了。

⑵ 用ViewBag传递数据

该特性允许你在一个动态的对象上定义任何的属性,并在视图中访问它。

⑶ 使用ViewData传递数据

ViewData特性类似于View Bag特性,他是用ViewDataDictionary类实现的,而不是动态对象。

ViewDataDictionary类类似于规则的“键/值”集合。

ASP.NET 控制器和动作方法

时间: 2024-08-10 14:54:15

ASP.NET 控制器和动作方法的相关文章

SpringMVC 控制器中 动作方法返回其他类型(输出ActionResult子类)

初来乍到,多多包涵. EmptypeResult:输出空类容 ContentResult:输出文本内容 return Content("数据"); JsonResult:输出josn数据 return Json(数据, JsonRequestBehavior.AllowGet); JavaScriptResult:输出js脚本 return javascript("js脚本") RedirectResult:重定向 return Redirect("~/控

MVC控制器中动作方法返回的结果

在MVC控制器中主要的返回方式有如下几种: 1.Content(): 返回文本类型的ContentResult,比如"这是我做的一个MVC". 2.File(): 返回文件类型的内容FileResult,比如PDF 3.HttpNotFound(): 返回包含404HTTP状态码的HttpNotFoundResult. 4.JavaScript(): 返回包含JavaScript内容的JavaScriptResult,比如"function hello(){alert(Hel

005_控制器和动作

到达应用程序的每一个请求都是由控制器处理的.但要注意,不要把事务或数据存储逻辑放到控制器中,也不要生成用户界面. 在ASP.NET MVC框架中,控制器是含有请求处理逻辑的.NET类.其作用是封装应用程序逻辑.也就是说,控制器要负责处理输入请求.执行域模型上的操作,并选择渲染给用户的视图. 控制器的介绍 为了能够详细的说明控制器和动作的功能,这里使用“空(Empty)”模板创建一个名为“ControllersAndActions”的新的MVC项目(记得选择“创建单元测试项目(Create a u

第15章 控制器和动作

---------------------------------------------- 注:1.如果一个请求确实包含了一个参数的值,但又不能转换成正确的类型时,框架会传递参数类型的默认值,并将"ModelState"中 的这个参数名注册为一个验证错误.除非检查ModelState中的验证错误,否则,用户输入不良数据时,请求还是会被处理的 (以没用输入任何数据或输入默认值处理). 2.现实中,有些MVC程序员会把每个动作方法的结果都定义为ActionResult ,哪怕他知道返回的

ASP.NET MVC 全局过滤器(FilterConfig)、标记在控制器上和方法上的筛选器执行顺序

原文:ASP.NET MVC 全局过滤器(FilterConfig).标记在控制器上和方法上的筛选器执行顺序 FilterConfig->控制器上的筛选器-->方法上的筛选器(大-->小,上-->下) 全局-->控制器->个别 尝试的时候记得把返回true 1 protected override bool AuthorizeCore(HttpContextBase httpContext) 2 { 3 //return base.AuthorizeCore(httpC

YII框架分析笔记5:控制器和动作

CBaseController是控制器和挂件的基类,主要提供了视图渲染,挂件,剪辑.片段缓存等方法,CController是所有应用中自定义控制器的基类. 创建动作 [php] view plaincopy public function run($actionID) { if(($action=$this->createAction($actionID))!==null) { if(($parent=$this->getModule())===null) $parent=Yii::app()

ASP.NET 实现伪静态网页方法

方法一:利用Httphandler实现URL重写(伪URL及伪静态) 我们有时候会见到这样的地址:“http://www.huoho.com/show-12-34.html”,你或许认为在站点服务器根目录“/”下存在名为“show-12-34.html”的文件,其实实际它可能是不存在的,而可能你看到的内容是“/aspx/show.aspx?type= 12&id=34”的内容,为什么要这样做呢?原因有多个方面:首先是增强URL的友好性,记“show-12-34.html”总比 “/aspx/sh

ASP.NET 表单验证方法与客户端(浏览器)服务器交互机制的故事

想到这个问题完全是一个意外吧,是在寻找另外一个问题答案的过程中,才对验证方法与浏览器服务器交互机制的关系有了清晰的认识. 先说下验证方法,验证方法分为前台验证和后台验证. 前台验证就是类似jQuery.Validate这类的插件,当然也可以我们自己写. 后台验证就是ASP.NET自带的验证控件,如RequiredFieldValidator. 记得初学.NET的时候,那会儿接触验证控件,也知道验证分为前台,后台.但是随着时间的推移,由于做的项目基本上都是公司内部使用的软件,比如OA.因为这种项目

将插座变量(IBOutlet)关联到*.xib文件中对象 + 将对*.xib对象的操作关联到动作方法(IBAction)

将插座变量(IBOutlet)关联到*.xib文件中对象 以BNRDetailViewController.m和BNRDetailViewController.xib为例(<iOS编程>第10章例子) 1.打开BNRDetailViewController.xib,添加一个UITextField对象: 2.在辅助编辑器中打开BNRDetailViewController.m,方法是:按住Option键并点击项目导航面板中的BNRDetailViewController.m: 3.按住Contr