控制器和动作方法之Action动作方法

1.产生输出
控制器在完成了一个请求的处理后,通常需要生成一个响应。
如:
如果想发送一个HTML响应,必须参加并装配html数据,并用Reponse.write方法发送到客户端。
Demo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MVC_Project05.Controllers
{
    public class BasicController : IController
    {
        public void Execute(RequestContext requestContext)
        {
            string controllerName = requestContext.RouteData.Values["controller"].ToString();
            string actionName = requestContext.RouteData.Values["action"].ToString();
            if (actionName.ToLower()=="redirect") {
                //重定向到指定的URL:底层还是动作方法的调用
                requestContext.HttpContext.Response.Redirect("/Derived/Index");
            }

            requestContext.HttpContext.Response.Write(
             string.Format("Controller:{0},Action:{1}",controllerName,actionName)   
             );
        }
    }
}

2.理解动作结果
MVC框架使用动作结果(Action Result)把指明意图和执行意图分离开来。
在动作方法被执行后,创建MVC框架处理的ActionResult对象以产生结果。
Action动作方法返回一个派生于ActionResult类的对象,它描述控制器响应要完成的功能。例如;渲染一个视图、重定向到另一个URL或动作方法等等。但是这是间接发生的,不直接产生响应。

MVC框架含有许多内建的动作方法结果类型,所有类型都是派生于ActionResult,其中不少类型在Controller类中有便利的辅助器方法:

在这里插入图片描述
在这里插入图片描述
通过渲染视图返回HTML:
动作方法最常用的一种响应形式是生成HTML,并将其发送给浏览器。

 public ActionResult Index(int num=0)
        {
            ViewBag.Message = "Hello from the DerivedController Index Method";
            //渲染MyView视图,并将响应渲染给客户端
            return View("MyView");
            //return View();
        }

Controller类中,提供了一些重载的View()方法返回ViewResult对象,用来渲染视图返回HTML,发送给客户端:几个比较常用的方法:
View () -->渲染和当前Action动作方法名称相同的View视图
View (object model)---->渲染和当前Action动作方法名称相同的View视图,并且传递Model视图模型对象
View (string viewName) ------>渲染指定名称的View视图(只能位于同一个Controller下Action对应的View视图)
View (string viewName, object model)-------->渲染指定名称的View视图(只能位于同一个Controller下Action对应的View视图),并且传递Model视图模型对象

视图查找过程:
当动作方法返回ViewResult对象,MVC接收到该对象,会在当前项目的Views目录下, 根据视图名称去查找,如果存在区域(Areas),会去/Areas/View/目录下去找
如果不存在区域(Area),则会去以当前控制器(去掉Controller)为名的Views下的子文件夹去查找,如果找到了就停止搜素,使用找到的视图响应渲染给客户端

通过路径指定视图:
Demo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVC_Project05.Controllers
{
    public class ExampleController : Controller
    {
        // GET: Example
        public ActionResult Index()
        {
            return View("~/Views/Derived/MyView.cshtml");
        }
    }
}

如果要渲染属于另一个控制器的视图,那么把用户重定向到那个控制器的一个动作方法也许会更好一些。

将数据从动作方法传递给视图,请看之前写的文章:
View视图之在Action动作方法中传递参数给视图

执行重定向:
有一种动作方法的通常结果并不是直接产生输出,而是把用户的浏览器重定向到另一个URL。大多数情况下,这个URL是应用程序的另一个动作方法,它生成你希望用户看到的输出。

1.重定向到字面URL:
对浏览器进行重定向的最基本的方法是调用Redirect方法,它返回RedirectResult类的一个对象,
Demo:

  /// <summary>
        /// 实现重定向
        /// </summary>
        /// <returns></returns>
        public ActionResult Redirect()
        {
            //Response.Redirect("/Derived/Index");
            //return new RedirectResult("/Derived/Index");
            return Redirect("/Derived/Index");//重定向到指定的URL,临时重定向(发送HTTP代码 302)
        }

重定向到路由系统的URL:

 public RedirectToRouteResult RouteRedirect()
        {
            //Response.Redirect("/Derived/Index");
            //return new RedirectResult("/Derived/Index");
            return RedirectToRoute(
                new {controller= "Derived",action= "Index", id=158562}
                );
        }

RedirectToRoute()方法有几个重载的方法:
我们使用的是这个方法:接收一个object类的参数对象
RedirectToRoute(object routeValues)

     我们在这里传递一个匿名对象,其属性被传递给路由系统,
     如果在路由系统中匹配上了指定URL模式的路由,则生成一个URL

重定向到一个动作方法:
可以使用RedirectToAction和RedirectToActionPermanent方法(也是一些重载方法),可以更优雅的实现重定向到一个动作方法
Demo:

/// <summary>
/// 
/// RedirectToAction(string actionName)
/// RedirectToAction(string actionName, string controllerName)
/// 
/// </summary>
/// <returns></returns>
public ActionResult ActionRedirect()
{
   //return RedirectToAction("Index");//只能重定向到当前Controller下的指定的Action动作方法
   return RedirectToAction("Index","Home");//重定向到Home控制器下的Index动作方法(可重定向到其他控制器中的Action)
}

返回错误和HTTP代码:
内建的ActionResult类可以用来给客户端发送指定的错误信息和HTTP结果码:

/// <summary>
/// 发送特定的HTTP结果码
/// </summary>
/// <returns></returns>
public HttpStatusCodeResult StatusCode() {
  //return new HttpStatusCodeResult(404,"URL cannot be serviced");
  //return HttpNotFound();//发送404结果
  return new HttpUnauthorizedResult();//发送401结果:指示未授权请求-->需要把用户重定向到认证页面 
}

注意:Action动作方法不仅仅可以去执行诸如以上的操作,
在Ajax请求处理中,调用指定Controller下的Action动作方法,其动作方法返回值类型可以为string或者JsonResult类型,将数据响应给客户端

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读