ASP NET MVC – 关于Action返回结果类型的事儿(上)

合集下载

ASP.NETMVC5基础-控制器(Controller)详解

ASP.NETMVC5基础-控制器(Controller)详解

MVC5基础-控制器(Controller)详解在上⽂中我们简单了解了下控制器Controller的作⽤,本⽂我将详细介绍控制器Controller的使⽤⽅法。

Controller的运⾏过程上⽂我们已经讲到,控制器负责响应浏览器传送过来的所有请求。

在MVC中,每⼀个浏览器请求都映射到⼀个控制器(Controller)中,每个请求都会有个动作(Action),只要动作存在,就可以通过该动作⽅法接收客户端传来的请求与决定响应的视图(View)。

我们以之前创建的MVC项⽬为例,打开项⽬的Index.cshtml页⾯。

显⽰的界⾯如下:根据路由规则,Home是控制器(Controller)名,Index是动作(Action)名。

所以这个URL调⽤的是HomeController控制器下的Index⽅法。

在Index⽅法中,只有这么⼀⾏代码:return View();,表⽰返回视图,然后返回给浏览器的是Views/Home⽂件夹下的Index.cshtml页⾯。

虽然我们在Index⽅法中没有指定返回哪个页⾯,但根据 MVC的约定规则,控制器会找到Views⽂件夹中,与Controller名称相同⽂件夹下的同⼀⽅法名的页⾯。

所以返回的是Home下的Index.cshtml页⾯。

具体的有关控制器返回View的内容下⽂会详细说明。

控制器的运⾏过程⼤体如上,从浏览器请求到控制器返回结果的整体流程为:Controller请求参数处理那么在Index⽅法中,正常情况我们可以通过Request.QueryString获取到这两个参数。

如下:public ActionResult Index(){var name = Request.QueryString["name"];var age = Request.QueryString["age"];return Content($"name:{name},age:{age}");}public ActionResult Index(string name,int age){return Content($"name:{name},age:{age}");}打开页⾯输出结果还是⼀样的:相同的,如果浏览器通过POST⽅式传过来⼀个表单,那么我们也可以在Index参数中使⽤表单对应的Model实体类来接收。

ASP.NETMVC源码分析(一)

ASP.NETMVC源码分析(一)

MVC源码分析(⼀) MVC 源码分析(⼀) 直接上图: 我们先来看Core的设计: 从项⽬结构来看,.mvc.core有以下⽬录:ActionConstraints:action限制相关AntiForgery:防伪相关ActionResults:action返回对象相关ApiExplorer:API描述和元数据相关接⼝ApplicationModels:应⽤程序模型相关,应该是全局的modelAreas:地区标签Filters:⼤名⿍⿍的过滤器组件Formatters:格式化相关的东东Internal:这个从名称看不出是做什么的,打开⼀看⾥⾯是⼀个路由决策树的实现ModelBinding:模型绑定,从request 对象取值映射到model的实现ParameterBinding: ModelBinding的上下⽂和模型更新⼊⼝Rendering:重量级选⼿,视图渲染逻辑都在这了Routing:路由控制相关ViewComponents:视图组件剩下的⼀些零闪的类⼤致就是controller,controllerFactoary和⼀些限定请求资源的标签的实现,OK 接下来让我们开始探究吧! ⾯对⼀堆的类我们要从哪开始⼊⼿呢?对!我们要找到整个core的⽣命周期的主线,从主线⼊⼿解析相关组件设计,根据整个管道模型的设计(园⼦讲这个的⽂章很多,我就不熬述了),我们可以了解到,.mvc.core 实际上负责的是httphandler⽣命周期中做的⼀些事情,他从获取httpContext.Request 对象进⾏消息路由(Routing),请求过滤(filters,AntiForgery,ActionConstraints),参数映射(⽐如modelBinding,ParameterBinding),参数验证(⽐如modelValidate),逻辑处理,最后返回结果(ActionResults),对结果进⾏渲染输出到流(Rendering,ViewComponents)。

asp net mvc讲解(3)

asp net mvc讲解(3)

Html.Helper类—CheckBox & RadioButton
• <%: Html.CheckBox(“bookType”) %> 在Controller获取提交的值为 (true,false)未操作 true选择 false不选择三种 • RadioButton第一个参数为控件名字(名字相同说明为同一个Group),返 回值为第二个参数(红色部分)
Html.Helper类—RenderAction
代码实例: <% Htntroller>( x => x.ControllerAction() ); %>
优点 :
• 让控制器做它该做的事情:组织逻辑及与业务逻辑之间的 通信。 • 将实际使用的视图/用户控件抽象出来,便于未来的重构。 • 将控制器中的业务逻辑抽象出来,这也让你的业务逻辑可 以专心做它该做的事。 • 使用lambda表达式,强类型
Html.Helper类—Form
• 方式一:{} <% using(Html.BeginForm("HandleForm", "Home")) %> <% { %> <!-- Form content goes here --> <% } %> • 方式二:Begin End <% Html.BeginForm(); %> <!-- Form content goes here --> <% Html.EndForm(); %>
MVC客户端验证
• 要使用客户端验证,必须引入JS脚本支持 MicrosoftAjax.js MicrosoftMvcValidation.js • 添加语句 <% Html.EnableClientValidation(); %> • .NET 框架中的ponentModel.DataAnnotations命名空间包括了众多 可为你所用的内置验证特性,介绍用的最多的其中的四个:[Required], [StringLength], [Range], 和 [RegularExpression]。 • 定义自己的定制验证特性,然后应用它们。你可以通过继承自 ponentModel.DataAnnotations命名空间中 的ValidationAttribute基类, 定义完全定制的特性。

浅谈Asp.netMvc之Action如何传多个参数的方法

浅谈Asp.netMvc之Action如何传多个参数的方法

浅谈Mvc之Action如何传多个参数的⽅法最近,⼯作上有⼀个需要:⽤户查询⽇志⽂件信息,查看某⼀个具体⽇志信息,可能同时查看该⽇志所在⽇期的其他⽇志信息列表。

为完成此功能,我打算在URL中传⼊了两个参数,⼀个记录此⽇志时间,另外⼀个记录⽇志的主键ID,因此,准备从 MVC的路由⼊⼿。

在Global.asax⽂件中,默认路由如下。

routes.MapRoute("Default", // 路由名称"{controller}/{action}/{id}", // 带有参数的 URLnew { controller = "Logon", action = "Logon", id = UrlParameter.Optional } // 参数默认值);这个路由中,在Action后⾯只能传⼊⼀个参数,不能传⼊多个参数,因此,需要增加路由信息。

在Global⽂件中,新增了⼀个路由,路由名称为“Default1",代码如下//第⼀种路由传两个参数过去routes.MapRoute("Default1","{controller}/{action}/{Parma1}/{Parma2}",new { controller = "", action = "" },new { });上述路由,可以传⼊两个参数。

在此,我们建⼀个TestController,添加⼀个Test.cshtml页⾯,在TestController写下代码,如下public ActionResult Test(string date, string id){ViewData["date"] = date;ViewData["id"] = id;return View();}在Test.cshtml页⾯中写如下代码要查询的⽇志时间为:@ViewData["date"]<br />要查询的⽇志ID为:@ViewData["id"]<br />要查询的⽇志时间为:2013-12-18要查询的⽇志ID为:5现在⼜有⼀个问题来了,需要传⼊多个参数,怎么办呢?当然,只有新添加新的路由”Default2"。

.net core mvc ok方法的使用

.net core mvc ok方法的使用

.net core mvc ok方法的使用在 Core MVC中,使用"OK"方法来返回一个成功的HTTP 响应。

通常,这是通过在控制器的方法中使用"IActionResult"返回类型实现的。

下面是一个示例,演示如何在 Core MVC中使用"OK"方法:csharp复制代码using Microsoft.AspNetCore.Mvc;public class HomeController :Controller{public IActionResult Index(){// 模拟一些处理逻辑string message = "Hello, World!";// 使用OK方法返回成功的HTTP响应return Ok(message);}}在上面的示例中,Index方法返回一个字符串"Hello, World!"作为消息,并使用Ok方法将其包装在一个成功的HTTP响应中。

当该方法被调用时,它将返回一个状态代码为200的HTTP响应,并在响应正文中包含传递给Ok方法的消息。

您还可以使用OkObjectResult类来返回一个包含多个属性的对象作为响应。

以下是一个示例:csharp复制代码using Microsoft.AspNetCore.Mvc;public class HomeController : Controller{public IActionResult Index(){// 模拟一些处理逻辑string message = "Hello, World!";int statusCode = 200;// 使用OkObjectResult返回一个成功的HTTP响应return OkObjectResult(new { StatusCode = statusCode, Message = message });}}在上面的示例中,Index方法返回一个包含StatusCode和Message属性的匿名对象。

如何实现MVCActionResult返回类型为JavaScriptResult

如何实现MVCActionResult返回类型为JavaScriptResult

如何实现MVCActionResult返回类型为JavaScriptResult必需的js引⽤⽂件<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>@Scripts.Render("~/bundles/jquery")View页⾯@using (Ajax.BeginForm("EditGPY", "GPY", new AjaxOptions(), new { @id = "frmgpy", @class = "form-horizontal" })){@Html.HiddenFor(m => m.PicPath)<table><tr><td>保存路径</td><td style="padding-left:1em">@Html.TextBoxFor(m => m.SavePath, new { @class = "form-control", @id = "FilePath", @readonly = "readonly" })</td></tr> </table><div class="form-group"><div class="col-md-10">@Html.HiddenFor(m => m.ReceiptNo, new { @id = "txtReceiptNo" })</div></div><div class="form-group"><div class="col-md-offset-2 col-md-10"><input data-ajax="true" type="submit" class="btn btn-primary" value="上传⽂件"/></div></div>}Controllerif (string.IsNullOrEmpty(model.ReceiptNo) || string.IsNullOrEmpty(model.SavePath) || string.IsNullOrEmpty(model.PicPath)){return base.JavaScript("alert('信息有误,不能上传')");}效果。

asp.netMVC


2014-6-13
8Hale Waihona Puke URL的请求规则定义的,这个规则定义在Global.asax.cs中定义 //此路径不受后面规则控制 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); //加一个路由规则 routes.MapRoute( “Default”, // 路由名称 “{controller}/{action}/{id}”, // URL 规则 new { controller = “Home”, action = “Index”, id = “” } // 默认规则 );
2014-6-13
10
规则写好了,接下来写controller,Action 和View
2014-6-13
11
在controller里添加一个Action
注意: 1.一个controller里面可以放多个Action 2.由于我们写的路由规则是 "{controller}/{action}/{ClassID}/{Pageindex}", 所以 public ActionResult ShowDemo(int ClassID, int Pageindex) { return View(); } 通过参数我们就能获取URL里面的两个参数了
2014-6-13
14
ViewData可以装什么数据
1.object 类型 2.如果是数据集合的话, 提倡用List<T>泛型集合
2014-6-13
15
ViewData和TempData的区别
2014-6-13
16
1.先访问http://localhost/News/Index

ASP.NET的MVC请求处理流程

的MVC请求处理流程
1、⽤户打开浏览器,在地址栏输⼊某个⽹址的URL并回车,浏览器便开始像该URL指定的服务器发起HTTP请求。

2、服务器的⽹站服务系统(IIS)接收到该请求,先检查⾃⼰是否认识该类请求,如果认识就直接处理并发回响应,否则就将该类请求发给对应的HTTP处理程序(在此时的MVC)。

3、MVC的路由系统接收到该请求,根据HTTP请求的URL,把请求定向到指定的控制器中.。

4、如果控制器是MVC内置的标准的Controller,则启动Action机制;否则,根据⾃定义的控制器逻辑,直接像浏览器发回响应。

5、MVC路由把HTTP请求定向到具体的Controller/Action中,如果Action没有使⽤视图引擎,则根据⾃定义逻辑发回响应;否则返回ActionResult 给视图引擎,由视图引擎渲染呈现HTML,并发回浏览器。

ASP.NETMVC4WebAPI学习正确返回JSON数据方法

MVC4WebAPI学习正确返回JSON数据方法MVC我相信各位肯定都有所了解了,今天我们一起来看看 MVC 4 Web API 学习正确返回JSON数据方法,希望文章对各位有帮助.web api 本来就可以返回json格式的,为什么我们要还对它做一些修改呢?因为web api默认返回的是xml,在提交请求的是设置了 Content-Type: application/json;返回的才是JSON格式的数据!但是怎么做到让它只是返回JSON格式的数据呢?有时候就会遇到这种需求!这是我最开始的做法]public static void Register(HttpConfiguration config){config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional });var json = config.Formatters.JsonFormatter;json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;config.Formatters.Remove(config.Formatters.XmlFormatter);}可以返回JSON格式了,但是莫名其妙的多出了个$id 不懂哪里来的!最后正确的办法是使用自定义的只返回Json Result的content negotiation代替Web Api中默认的content negotiation。

Conneg 通过实现IContentNegotiator的Negotiator方法实现扩展。

ASPNET程序设计教程第12章-ASPNET-MVC课件

② Global.asax:全局配置文件,用于设置全局URL路由的默认 值,在应用程序启动时可通过该文件执行一些特殊操作。
③ packages.config:项目中附加的软件包配置文件,由系统 自动生成和管理,一般不需要程序员编写和修改。
④ Web.config:XML格式的网站或文件夹的配置文件。其作 用与Web Forms项目中的web.config文件相同。
② App_Start文件夹:用于存放配置类的代码文件,默认包含 有一个名为“RouteConfig.cs”的路由配置文件,也就是 MVC项目的“路由表”。
③ Controllers文件夹:用于存放项目中所有控制器文件的文件 夹。
④ Models文件夹:用于存放项目中所有模型文件的文件夹。
12.2.1 MVC路由
1. 注册路由
所谓“注册路由”就是通过存放在App_Start文件夹下的 RouteConfig.cs所表述的RouteConfig类中定义的 RegisterRoutes()方法,将URL、控制器及对应的Action关联起 来
12.2 MVC路由
12.2.1 MVC路由 2. 从URL向控制器传递数据
文件、Web API及其它各种服务(Web Service)中的数据都可以通 过模型传递给控制器。用户提交的数据也可以通过模型传递给数据 库。
通过模型向视图传递数据一般需要经过以下3个步骤,在 Models文件夹下创建模型类;在控制器中获取模型数据;最后在视 图中显示模型数据。本节将通过一个简单的示例说明通过模型向视 图传递数据的具体实现。
TempData的另一个典型用法是,在数据重定向到另一个 Action方法之前先通过TempData存储要传递的数据,而后再从 另一个Action中得到这些数据。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ASP.NET MVC – 关于Action返回结果类型的事儿(上) 一、 ASP.NET MVC 1.0 Result 几何?

Action的返回值类型到底有几个?咱们来数数看。 ASP.NET MVC 1.0 目前一共提供了以下十几种Action返回结果类型: 1. ActionResult(base) 2. ContentResult 3. EmptyResult 4. HttpUnauthorizedResult 5. JavaScriptResult 6. JsonResult 7. FileResult (base) 8. FileContentResult 9. FilePathResult 10. FileStreamResult 11. RedirectResult 12. RedirectToRouteResult 13. ViewResultBase(base) 14. ViewResult 15. PartialViewResult

一个列表下来看得人眼花缭乱,因为可用的Result很多,接着再瞧瞧类关系图以佐辨析:

如图中可见,ActionResult可谓人丁兴旺,目前膝下有儿9子(如图中红色所圈的类),ViewResultBase与FileResult又各有子两三口,这些儿孙们各司所长。那么各个 Result 都会干点啥事儿呢?这个问题说来话长,不过根据诸如“虎父无犬子”、“种瓜得瓜,种豆得豆”、“龙生龙,凤生凤,老鼠的孩子打地洞”的俗语,孩子们多少从他爹那儿遗传了点什么,所以要说明它们的才干之前,得先唠叨唠叨一下 ActionResult这个爹,这个爷,因此这事情还是得先从ActionResult说起。

二、朴实的 ActionResult

所有的 Result 都派生自 ActionResult抽象类,因此 ActionResult 作为基类提供了最基础的功能,ActionResult 是一个抽象类,其声明如下:

public abstract class ActionResult {

public abstract void ExecuteResult(ControllerContext context);

}

看看普通人民、相貌平平的ActionResult,ActionResult 是个朴素老百姓,没啥特长,就一个 ExecuteResult() 抽象方法,这个ExecuteResult() 抽象方法还啥都不干,遗传给儿女孙子们让它们去发挥,那么它的责任其实就很明确了,它就是为遗传作准备的,繁殖下一代用的,是只公猪种。因为ActionResult是所有Result的基类,因此你可以在所有的Action上使用它作为返回值类型,而无需动脑筋来明确与返回值相同的类型。

二、 EmptyResult

EmptyResult 是ActionResult 最没用的儿子,虽然生儿都想生孙仲谋,希望儿子们都是八斗之才,国家栋梁,可惜第一胎 EmptyResult 就严重破坏了它的梦想,看来也只能痛恨自己种子不够好。咱来瞧瞧这个没用的阿斗:

//表示一个啥都不干的结果,就像 controller action 返回 null public class EmptyResult : ActionResult {

private static readonly EmptyResult _singleton = new EmptyResult();

internal static EmptyResult Instance { get { return _singleton; } }

public override void ExecuteResult(ControllerContext context) { } }

EmptyResult 遗传并实现了ActionResult的ExecuteResult()方法,同时也遗传了ActionResult的天真朴实的想法,也想“还是等下一代吧”,它有点老子的“无为”味道,所以它的ExecuteResult()方法像足了它的老爹,啥也不干。

EmptyResult 类使用了简单的单例模式,看来这样不思进取的儿子,整个家族里头生一个就够糟糕了,用广东人的话说,生它还不如生块叉烧肉。

在Action中,若要返回一个空的页面(不常用),则可如下:

public ActionResult Index() { return new EmptyResult(); }

执行后页面将缺省返回一个body为空的HMTL架构:

三、RedirectResult EmptyResult的“无为”给ActionResult 的打击着实不小,只好将期待落在其他孩子身上,RedirectResult虽然不是什么大才,起码有一技之长,我们看看它的 ExecuteResult() 方法:

public override void ExecuteResult(ControllerContext context) { if (context == null) { throw new ArgumentNullException("context"); }

string destinationUrl = UrlHelper.Content(Url, context.HttpContext); context.HttpContext.Response.Redirect(destinationUrl, false /* endResponse */); }

RedirectResult用于执行转移。事实上 RedirectResult 最终调用了 Response.Redirect() 进行转移,所以您可以使用RedirectResult跳转到任意的包括当前项目或网络上的Url,例如:http://www.cnblogs.com,对于当前项目的路径,因为使用了UrlHelper.Content() 方法获取目标路径,所以RedirectResult传递的Url同时支持当前项目目录标识符 ~ (即应用程序目录)。

四、RedirectToRouteResult

RedirectToRouteResult对于RedirectResult而言,其作用有所局限,仅能转移到路由(路由匹配的结果最终是一条相对当前项目的Url,例如: /Home/Index ),总的来说与RedirectResult的最终作用是一样的,都是执行转移。RedirectResult较为直接地转移到任意指定的Url,而RedirectToRouteResult则转移到指定的路由(路由匹配所得结果最终也是一个的Url):

public override void ExecuteResult(ControllerContext context) { if (context == null) { throw new ArgumentNullException("context"); }

string destinationUrl = UrlHelper.GenerateUrl(RouteName, null /* actionName */, null /* controllerName */, RouteValues, Routes, context.RequestContext, false /* includeImplicitMvcValues */); if (String.IsNullOrEmpty(destinationUrl)) { throw new InvalidOperationException(MvcResources.ActionRedirectResult_NoRouteMatched); }

context.HttpContext.Response.Redirect(destinationUrl, false /* endResponse */); }

RedirectToRouteResult先通过调用UrlHelper.GenerateUrl()来获得路由匹配所得的最终Url,接着的执行转移过程与RedirectResult相同。

路由配置的过程在Global.asax文件中进行,在以MVC模板方式创建的MVC项目中都带有此文件,可在文件中的MvcApplication类的 RegisterRoutes()方法中进行配置路由,该方法缺省的内容如下:

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

routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults );

}

RedirectToRouteResult 可跳转至任何一条匹配的路由规则。是以利用路由转移可以跳转到其他控制器的 Action。

五、ContentResult

ContentResult用于将字符串直接向客户端输出。ContentResult的ExecuteResult方法实际上

相关文档
最新文档