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

    .

  • 相关阅读:
    拓端数据tecdat|R语言用主成分PCA、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化
    拓端数据tecdat|R语言进行数据结构化转换:Box-Cox变换、“凸规则”变换方法
    拓端数据tecdat|R语言信用风险回归模型中交互作用的分析及可视化
    拓端数据tecdat|R语言多重比较示例:Bonferroni校正法和Benjamini & Hochberg法
    拓端数据tecdat|调查数据聚焦护士职业满意度
    拓端数据tecdat|【视频】Python和R使用指数加权*均(EWMA),ARIMA自回归移动*均模型预测时间序列
    拓端数据tecdat|R语言基于Bootstrap的线性回归预测置信区间估计方法
    拓端数据tecdat|R语言贝叶斯线性回归和多元线性回归构建工资预测模型
    拓端数据tecdat|R语言分段线性回归分析预测车辆的制动距离
    java序列化和反序列化
  • 原文地址:https://www.cnblogs.com/shishixiang/p/14101839.html
Copyright © 2020-2023  润新知