路由和数据传递(04)
目录:
-
视图引擎
-
路由
-
数据传递
一、视图引擎
1.1 ASP.NET MVC 提供两种视图引擎:
①ASPX(C#)。
②Razor(CSHTML)。推荐使用Razor。
1.2 Razor
- 标志符号:@
- 语句块:@{ }
- 转义符:@@
- 命名空间:@
- 注释:@* *@
1.@( expression) 或 @ expression @是Razor中的一个重要符号,它被定义为Razor服务器代码块的开始符号。 <p> @Datetime.Now.ToStirng()</p> 可省略括号 @("razor视图".ToString() ) 不可省略括号
2.@{}
@{ var stu = new RazorDemo.Models.Student();
stu.StudentName = "王五";
<p>姓名:@stu.StudentName</p>
}
@foreach (var stu in students)
{
<p>姓名:@stu.StudentName</p>
}
@if (stu.Gender == "男")
{
<p>姓名:@stu.StudentName</p> }
3.@@
<p>@@2013 copy right</p>
4.@
@using RazorDemo.Models
5.@* *@
1.3布局页
用处:有助于多个视图保持一致外观,语法简洁,灵活性高。
使用:定义公共模板,包含一个或多个占位符,其他视图可提供内容。
- 每一个布局页都要Layout声明,形成代码冗余。自动添加的_ViewStart.cshtml页面可以用来消除这种冗余。
- 占位符:@RenderBody() 只允许有一个,@RenderSection( ) 可有多个。
- @RenderSection( ) 有一个重载,第二个类型是bool,指明是否为必须。
- 注意:视图里有的定义,占位符里也要有。多个占位符要加section。
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>@ViewBag.Title</title> </head> <body> <div id="main-content"> @RenderBody() <!--占位符,用来标记主要内容的位置--> </div> </body> </html> <!--占位符内容--!> @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/SiteLayout.cshtml"; } <h2>这是主页内容</h2> <!--总效果--!> <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <div id="main-content"> <h2>这是主页内容</h2> </div> </body> </html>
二、路由
2.1 为什么需要路由
- 屏蔽物理路径,提高安全性。
- 有利于搜索引擎的优化。
URL:
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
// 参数默认值
);
序号 |
URL模式 |
匹配的URL示例 |
1 |
{controller}/{action}/{id} |
/books/Edit/1,/Books/Detail/2 |
2 |
{first}/{second}/{third} |
/book s/Edit/1,/Books/Detail/2 |
3 |
{table}/Detail.aspx |
/Users/Detail.aspx, /Books/Detail.aspx |
4 |
Blog/{action}/{id} |
/Blog/Show/1001, /Blog/delete/1001 |
5 |
{language}-{country}/{action} |
/zh-cn/display, /en-us/list |
2.2路由规则
注意事项:
- URL模式匹配不区分大小写。
- 两个占位符之间不能连续。
- "/"和一般的字面量相比,是比较特殊的。
- 不能以"/"或"~"字符开头,不能包含"?"。
一些特殊模式:
(1)* 匹配
* 用来匹配剩余部分。
(2)贪婪匹配
匹配直到找到为止。
(3)默认值
只提供中间参数或包含字面量时默认值就不能用。
(4)路由约束
添加正则表达式约束
(5)多个路由
有多个路由时,排在前面的优先匹配。
2.3路由数据
RouteData对象用来保存URL模式和实际URL匹配产生的路由数据,这些路由数据以键-值对的形式保存。
序号 |
URL模式 |
匹配的URL示例 |
路由数据 |
1 |
{controller}/{action}/{id} |
/books/Edit/1, /Books/Detail/2 |
Key=Controller,Value=Books Key=action,Value=Edit Key=id,value=1 |
2 |
{first}/{second}/{third} |
/books/Edit/1, /Books/Detail/2 |
Key=first,Value=Books Key=second,Value=Edit Key=third,value=1 |
3 |
{table}/Detail.aspx |
/Users/Detail.aspx, |
Key=table, value=Users |
4 |
Blog/{action}/{id} |
/Blog/Show/1001 |
Key=action, value=show Key=id, value=1001 |
5 |
{language}-{country}/{action} |
/zh-cn/display, |
Key=language, value=zh Key=country,value=cn Key=action, value=display |
string id = RouteData.Values[ "id" ] ;在使用时注意验证是否为null。
三、数据传递
3.1 ViewData
字典集合数据,object类型,同时属于视图基类和控制器基类的属性。
//控制器代码 public class HomeController : Controller { public ActionResult Index() { ViewData["data"] = "Hello,MVC!"; return View(); } } //视图代码 <h1>@ViewData["data"]</h1>
3.2 ViewBag对象
ViewDate的包装,所以可以互相读取,dynamic 类型的对象,同时属于视图基类和控制器基类的属性。
//控制器代码 public class HomeController : Controller { public ActionResult Index() { ViewBag.data = "Hello,MVC!"; return View(); } } //视图代码 <h1>@ViewBag.data</h1>
3.3TempData对象
跨请求传递数据,也就是说跨越动作方法传递数据。使用一次就会清楚
//控制器代码 public class HomeController : Controller { public ActionResult Index() { TempData["data"] = "Hello,MVC!"; return View(); } } //视图代码 <h1>@TempData["data"]</h1> //控制器代码 public class HomeController : Controller { public ActionResult Index() { TempData["data"] = "来自Index()的数据"; Response.Redirect("~/Home/Detail"); return View(); } public ActionResult Detail() { return View(); } <!-- Detail.cshtml 视图代码 --> <h1>@TempData["data"]</h1>
3.4强类型视图
不用数据类型转换。添加视图的时候,在向导对话框中选择"Empty模板"基类就变成了System.Web.Mvc.ViewPage<T>。
//动作方法中的代码 Book book = manager.GetBookById(id); return View(book); //视图中的代码 <div> 作者: @Model.Author 著 <br /> 出版社:@Model. Publisher.Name </div>
如果使用强类型视图,则在控制器中传递数据的方式变成直接使用 View()的一个带"model"的参数的重载方法。在视图中可以直接通过模型类的属性使用传递的数据。
.