路由和数据传递(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"的参数的重载方法。在视图中可以直接通过模型类的属性使用传递的数据。

.

原文地址:https://www.cnblogs.com/shishixiang/p/14101839.html