Controller中返回ActionResult的方法,这些方法被称之为Action(方法)。
一个Controller中可以有多个不同名的Action。
如果Action同名,需要遵守方法重载的语法规定:
说明/提示:ASP.NET的所有代码都需要遵守C#语法!
Action方法的返回值为ActionResult。注意:ActionResult是一个抽象类,下面还有很多具体的实现类,比如
通过return View() 返回的ViewResult,是最最常见的内容,返回一个完整的HTML页面。(其他实现类按课程进度讲解)
页面的生成依赖于:
即:方法View()的参数名,用于指定所需的.cshtml文件。
return View("~/Views/Home/Contact.cshtml"); return View("/Views/Home/Contact.cshtml");PS:~是ASP.NET独有的、历史遗留标记——“服务器根路径”(绝大部分时候等同于/)
return View("Home/Welcome"); //当前文件夹下有目录Home,Home下有Welcome.cshtml return View("Failed"); //当前文件夹下有Failed.cshtml return View("../Error"); //当前文件夹Shared文件夹下有Error.cshtml
演示:故意试图进入一个没有“适格”.cshtml文件的Action,查看报错信息(对比:找不到Controller和Action404错误)
了解ASP.NET MVC由上往下(即:有“优先级”的)查找view的路径
.cshtml又被称之为razor(模板)。
#小知识#:为什么是cshtml?cs+html:
整个cshtml文件除了(不可变的)html标签,还有一些@符号引导的(可变的)声明、语句、代码块等。
ASP.NET MVC利用razor view,“结合”不同的数据(Model),生成完整的HTML页面,返回给前端。
向razor view传递的数据,被称之为Model。
一种方法是使用ViewData。
在Action中赋值:
public ActionResult Index() { //想象:各种各样的内容都是可以从“数据库”取出来 //ViewData["greet"] = "源栈欢迎你"; ViewData["greet"] = true; return View();在razor view中取值:
<h1> @ViewData["greet"] </h1>
注意:ViewData是一个“键值对”,其中key是string类型,value是Object类型。
@想一想@:这样有什么问题?(同为什么需要泛型集合)
#预防针#:比如我们有这样的代码:
public ActionResult Index() { if (LogOnSuccess()) { ViewData["Success"] = true; } else //没有再给ViewData["Success"]赋值
在razor view这样就会报错:
@((bool)ViewData["Success"])
[]看起来不“舒服”,所以ASP.NET还推出了ViewBag,作为ViewData的“替代品”,但两者的问题是一样的。
要从根本上解决问题,需要引入
准备一个实现声明的类,
public class Student { //private bool gender; public int Id { get; set; } public string Name { get; set; }
将其对象作为参数传入View()
public ActionResult Index() { Student atai = new Student { Id = 10, Name = "阿泰" }; return View(atai);
在razor中:
@model _17bang.Models.Student
<h1> <a href="/User/@Model.Id">@Model.Name</a> </h1>注意此时的@Model,M是大写。
@想一想@:之前学习过的View()、ViewData、ViewBag这些,是从哪来的?
他们都是在Controller(基类)中定义的,Request也一样……
PS:通常所有Controller都放置在Controllers文件夹下,但决定一个类是不是Controller,取决于它有没有继承Controller基类,而不是有没有放在这个文件夹下。
Request对象封装了HTTP请求的诸多信息,最常用的是:
F12演示:QueryString的类型为NameValueCollection,有string/int索引器……
断点演示:QueryString获取的是URL中的参数
URL路径:/Student/Single?id=5,告诉后台:
后台准备好Controller和Action
public class StudentController : Controller { public ActionResult Single()
然后在Action方法中拿到id:
int id = Convert.ToInt32(Request.QueryString["id"]);
通过repository拿到对应的Student对象:
Student atai = new StudentRepoitory().Get(id); return View(atai); //传递给view……
#体会#:所谓动态页面的动态
直接使用Request.Form获取FormData,是最“原始”的方式:
string name = Request.Form["UserName"][0]; string password = Request.Form["Password"][0];
注意:
|
|
@想一想@:Request.QueryString["id"]和Request.Form["key"]好用么?为什么?
Request.Url:能获取几乎所有url相关的内容:Host / Port / Path / Query
Request.UrlReferrer:更多的时候我们是要取“上一个”URL的信息,即:用户从哪一个页面跳转到当前页面的
数据相关的:File / Cookie / Session(是在HttpContext中的)
HTTP协议相关的:HttpMethod / Headers(ContentType/UserAgent等简便方式)
@想一想@:Request对象是怎么生成的?它是怎么被“赋值”的?
多快好省!前端后端,线上线下,名师精讲
更多了解 加: