源栈培训:ASP.NET MVC-2:ActionResult

更多
2019年08月01日 21点24分 作者:叶飞 修改

MVC通过Controller里面的Action返回ActionResult呈现页面。

常用的ActionResult有以下几种:


ViewResult

通过 return View() 返回,是最最常见的内容,返回整个页面。


View的参数

View(string viewName)
  • 如果不指定,使用的View文件就是: \Views\<ControllerName>\<ActionMethodName>.cshtml
  • 否则,可使用viewname参数指定:
    1. 以“/”或“~/”开头的完整View文件(带.cshtml后缀)
                  return View("~/Views/Home/Contact.cshtml");
                  return View("/Views/Home/Contact.cshtml");
    2. 从当前目录或Shared目录开始的View名字(不带.cshtml后缀)
                  return View("Home/Welcome");    //当前文件夹下有目录Home,Home下有Welcome.cshtml
                  return View("Failed");  //当前文件夹下有Failed.cshtml
                  return View("Error");   //Shared文件夹下有Error.cshtml

View(object model)

  • 可以为空,不给View传值。
  • 也可以利用model设置默认选中项
                IndexModel model = new IndexModel
                {
                    UserName = "大飞哥",
                    IsMale = true
                };
                return PartialView(model);
    或者,其他需要传到View上展示的数据。
注意不传值和传空值(new Model())的区别:
            return PartialView(new IndexModel());
            return PartialView();
当new IndexModel()会给model中的值类型属性赋默认值,如 bool IsMale = false,从而影响比如radio/checkbox的呈现。

Action的参数

从客户端传来的数据,都可以被ASP.NET MVC自动转化为Action的参数。

数据源可包括:

  • Url Parameter(Request.Query)
  • RoutData,根据route config,对应其{}包裹的值
  • FormData(Request.Form)

Action的方法参数可以是:

  • 简单类型:int/string/bool/enum……,注意使用可空类型代表可选,非可空代表数据一定要有(没有就会报错)
  • 复杂类型:Model绑定,由ASP.NET MVC自动绑定。非常强大!

Model绑定过程中,如果Model的属性是

  • 简单类型:名作为数据源的Key值和匹配
  • 复杂类型:如果数据源的Key值有点号(.)分隔的话,按 . 分隔后从左到右依次匹配:属性、属性的属性、属性的属性的属性……
  • 集合:如果数据源的Key值有方括号([])的话,集合
  1. 截取.前的部分与Model的属性匹配;
  2. 截取.后的部分与Model的属性的属性匹配
  • (演示:checkbox list,略勾选)

PartialViewResult

通过 return PartialView() 返回的是一个部分页面。

和ViewResult非常相似(Action参数和PartialView()参数)。

最大的区别是不受_ViewStart.cshtml内容控制(通常是不自动引入_Layout)


@Html.Action()

在(Partial View的)Action上可以添加 [ChildActionOnly],使其成为 Child Action,只能被其他View调用,不能独立响应HTTP请求

        [ChildActionOnly]
        public PartialViewResult Reminder()
        {
            return PartialView();
        }
在其他View中调用该Child Action的代码为:
@Html.Action("Reminder", "Register", new { id = 32 })
  • Reminder:action name,必填
  • Register:controller name,可选,默认为当前Controller
  • new { id = 32 }:route data,可选,通常使用匿名对象
除了使用@Html.Action,还可以使用:


@Html.Partial()

和@Html.Action()相比,@Html.Partial():

  • 不经过Action,不需要和后台交互,适用于简单逻辑
  • 不使用route data,而是ViewData

注意:常见面试题!


RedirectResult


使用return Redirect()等返回,实现页面的重定向(跳转)

补充知识:常用Response的状态码(status code)

  • 200:正常返回
  • 301:永久(Permanent)重定向(用于SEO)
  • 302:暂时重定向
  • 404:找不到页面
  • 503:服务器端错误
复习:Get-Post-Redirect


注意:Redirect的实质是:

  1. 服务器发送一个Response到客服端,其中包含了重定向的指示
  2. 客户端根据重定向指示,再自动向重定向页面发送一个GET请求
  3. 服务器响应新的GET请求,再发送一个reponse给客户端

FileResult

包括:FilePathResult、FileContentResult、FileStreamResult,但都通过:return File()返回。

其主要用途有:

  • 弹出下载窗口,让用户可以方便的下载文件(演示:略
  • 显示动态生成的图片,比如:验证码
<img id="captcha" src="/Captcha/Get" />


        public ActionResult Get()
        {
            byte[] captcha = MakeCaptcha(out string value);
            Session[CAPTCHA] = value;//注意:不要把图片值放到cookie中!
            return File(captcha, "jpg");
        }
在后台比对用户输入和Session中保存的值:
            if (model.Captcha != Session[CaptchaController.CAPTCHA].ToString())
            {
                ModelState.AddModelError("Captcha", "* 验证码输入错误");
                return View(model);
            }

补充:JavaScript刷新验证码,在src的url后添加url parameter,原理同 RazorPage 中的 ImageTagHelper

<a href="#" onclick="refreshCaptcha()" >刷新</a>
<script>
    function refreshCaptcha() {
        var captcha = document.getElementById("captcha"),
            url = captcha.getAttribute("src"),  //这里需要进一步的完善!
            random = Math.random();
        captcha.setAttribute("src", url + "?version=" + random);
    }
</script>


JsonResult

通过 return PartialView() 返回Json类型的数据,通常用于Ajax。

        public JsonResult Index()
        {
            //Json的方法参数,可以是:
            //1、简单类型;
            //2、实例对象
            //3、匿名对象
            return Json(new {
                Age = 23,
                Name = "fg",
                Scores = new
                {
                    CSharp = 95,
                    SQL = 86
                }
            }, JsonRequestBehavior.AllowGet);   //默认为DenyGet
        }

输出到前台的内容为:

{"Age":23,"Name":"fg",
"Scores":{
    "CSharp":95,"SQL":86}
}


作业

  • 任何一个页面,
    1. 点击导航栏“登录”,跳转到登录页面;登录后返回之前页面
    2. 点击导航栏“退出登录”,如果当前页面不需要登录,只刷新不跳转,否则跳转到登录页面……
  • 使用PartialView重构页面重构页面右侧的widgets,如:关键字、精品文章、广告、系列文章(文章分类)、排行榜等
  • 实现验证码功能
  • 将验证码使用Partial View进行封装,能在注册/登录/修改密码等页面重用
  • 已学前台同学应完成所有功能,包括但不限于:
    1. 点击输入框才生成验证码
    2. 可以手动刷新验证码
源栈培训 ASP.NET MVC
赞: 2 踩: 2

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0
叶飞的系列文章

源栈培训:ASP.NET全栈开发

飞哥的源栈培训:线上全程直播,免费收看;线下拎包入住,按周计费。本系列收录所有讲义(含视频录播地址)

编程那些事:菜鸟入门

大飞哥倾力之作,面向有意入行IT/开发/编程的初学者,欢迎任何形式的留言建议……

从包工头到程序猿

真实故事,讲述我在家装公司关门之后,如何转行成为一个程序猿的故事。(《折腾》第三卷)

《折腾》(卷一)青涩

时间段:从大学毕业到开始创业。离开青葱校园,涉世之初的那些往事……

《折腾》(卷二)风雨 之(1)工地

我一个完全的门外汉(无论装修还是管理),开始给黎叔装修房子。从踌躅满志,到四处碰壁;从一往直前,到左右为难……

《折腾》(卷二)风雨 之(2)胸怀

作为一个律师,接工程没签合同,被狠狠的坑了一把!年轻人暴烈的想要复仇,黎叔教他一个企业家的胸怀……

《折腾》(卷二)风雨 之(3)渠道

成立了公司,招聘了员工,开始大力的拓展业务,一个接一个的坑,摔倒了又爬起来……

《折腾》(卷二)风雨 之(4)视野

经历残酷现实的磨砺,终于明白:干啥事,都不能闭门造车,人要走出去,开阔视野……

未分类

系统自动生成的未分类系列

一锅大杂烩

从律师到包工头,从码农到写手,读书交友生活创业,各种零零碎碎,乱七八糟……

人人都是程序猿

计算机编程普及课程,视频:https://space.bilibili.com/55410301/#/channel/detail?cid=49491

全部
关键字



帮助

反馈