zoukankan      html  css  js  c++  java
  • ASP.NET MVC 5 入门(03):添加视图

    原文:https://docs.microsoft.com/zh-cn/aspnet/mvc/overview/getting-started/introduction/adding-a-view

    作者: Rick Anderson

    ASP.NET MVC 5 入门

    ASP.NET MVC 5 简介

    此教程的更新版本可在此处使用最新版本的Visual Studio 新教程使用ASP.NET CORE MVC,这在本教程中提供了许多改进。

    本教程介绍具有控制器和视图的 ASP.NET Core MVC。 Razor 页面是 ASP.NET Core 2.0 中的一个新选择,它是基于页面的编程模型,可以实现更简单、更高效地生成 Web UI。 建议先尝试 Razor 页面教程,再使用 MVC 版本。 Razor 页面教程:

    • 易于关注。
    • 涵盖更多功能。
    • 是开发新应用程序的首选方法。

    以下教程系列介绍了GitHub上的 ASP.NET MVC: Source

    在本节中,您将修改 HelloWorldController 类以使用视图模板文件来将生成 HTML 响应的过程清晰地封装到客户端。

    使用Razor 视图引擎可以创建视图模板文件。 基于 Razor 的视图模板的文件扩展名为cshtml ,并提供使用C#创建 HTML 输出的简洁方法。 Razor 最大程度地减少了编写视图模板时所需的字符和击键数量,并启用了快速、流畅的编码工作流。

    当前,Index 方法返回带有在控制器类中硬编码的消息的字符串。 更改 Index 方法以调用控制器视图方法,如以下代码所示:

    public ActionResult Index() 
    { 
        return View(); 
    } 

    上面的 Index 方法使用视图模板生成浏览器的 HTML 响应。 控制器方法(也称为操作方法)(如上述 Index 方法)通常返回ActionResult (或派生自ActionResult的类),而不是基元类型(如 string)。

    右键单击ViewsHelloWorld文件夹,单击 "添加",然后单击 "带有布局的 MVC 5 视图页(Razor) "。

    在 "指定项目的名称" 对话框中,输入Index,然后单击 "确定"

    在 "选择布局页" 对话框中,接受默认 _Layout ,然后单击 "确定"

    在上面的对话框中,在左窗格中选择了 " ViewsShared " 文件夹。 如果在其他文件夹中有自定义的布局文件,则可以选择它。 我们稍后将在本教程中讨论布局文件

    将创建MvcMovieViewsHelloWorldIndex.cshtml文件。

    添加以下突出显示的标记。

    @{
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    
    @{
        ViewBag.Title = "Index";
    }
    
    <h2>Index</h2>
    
    <p>Hello from our View Template!</p> 

    右键单击该索引的 cshtml文件,然后选择 "在浏览器中查看"

    PI

    您还可以右键单击该索引的 cshtml文件,然后在 Page Inspector 中选择 "查看"。 有关详细信息,请参阅Page Inspector 教程

    或者,运行应用程序并浏览到 HelloWorld 控制器(http://localhost:xxxx/HelloWorld)。 控制器中的 Index 方法不会执行大量工作;它只是 return View()运行语句,该语句指定方法应使用视图模板文件来呈现对浏览器的响应。 由于未显式指定要使用的视图模板文件的名称,因此 ASP.NET MVC 默认使用 ViewsHelloWorld文件夹中的视图文件。 下图显示了我们的视图模板 "的字符串!视图中" 硬编码。

    看起来不错。 但请注意,浏览器的标题栏显示 "Index-My ASP.NET 应用程序",页面顶部的大链接显示 "应用程序名称"。 根据浏览器窗口的大小,可能需要单击右上角的三个栏才能看到 "主页"、"关于"、"联系人"、"注册" 和 "登录" 链接。

    一、更改视图和布局页

    首先,您需要更改页面顶部" 链接的 "应用程序名称。 该文本对于每个页面都是通用的。 它实际上只在项目中的一个位置实现,即使它显示在应用程序的每一页上也是如此。 中转到解决方案资源管理器中的 /Views/Shared文件夹,然后打开 _的布局 cshtml文件。 此文件称为布局页面,位于所有其他页面都使用的共享文件夹中。

    _LayoutCshtml

    布局模板允许在一个位置指定网站的 HTML 容器布局,然后将其应用到站点中的多个页面。 查找 @RenderBody() 行。 RenderBody 是显示创建的所有特定于视图的页面的占位符,已包装在布局页面中""。 例如,如果选择 "关于" 链接,则会在 RenderBody 方法中呈现ViewsHomeAbout.cshtml视图。

    更改标题元素的内容。 将布局模板中的html.actionlink从 "应用程序名称" 更改为 "MVC 电影",并将控制器从 Home Movies到。 完整的布局文件如下所示:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>@ViewBag.Title - Movie App</title>
        @Styles.Render("~/Content/css")
        @Scripts.Render("~/bundles/modernizr")
    
    </head>
    <body>
        <div class="navbar navbar-inverse navbar-fixed-top">
            <div class="container">
                <div class="navbar-header">
                    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>
                    @Html.ActionLink("MVC Movie", "Index", "Movies", null, new { @class = "navbar-brand" })
                </div>
                <div class="navbar-collapse collapse">
                    <ul class="nav navbar-nav">
                        <li>@Html.ActionLink("Home", "Index", "Home")</li>
                        <li>@Html.ActionLink("About", "About", "Home")</li>
                        <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
                    </ul>
                </div>
            </div>
        </div>
        <div class="container body-content">
            @RenderBody()
            <hr />
            <footer>
                <p>&copy; @DateTime.Now.Year - My ASP.NET Application</p>
            </footer>
        </div>
    
        @Scripts.Render("~/bundles/jquery")
        @Scripts.Render("~/bundles/bootstrap")
        @RenderSection("scripts", required: false)
    </body>
    </html> 

    运行该应用程序,请注意,它现在显示 "MVC 电影 "。 单击 "关于" 链接,你将看到该页面还 "MVC 电影"中的显示方式。 我们能够在布局模板中进行一次更改,并让网站上的所有页面都反映新标题。

    首次创建ViewsHelloWorldIndex.cshtml文件时,它包含以下代码:

    @{
        Layout = "~/Views/Shared/_Layout.cshtml";
    } 

    上述 Razor 代码显式设置布局页。 检查 \_ViewStart 的视图,其中包含的 Razor 标记完全相同。 视图\_ViewStart 的视图 定义所有视图都将使用的通用布局,因此,您可以从ViewsHelloWorldIndex.cshtml文件中注释掉或删除该代码。

    @*@{
        Layout = "~/Views/Shared/_Layout.cshtml";
    }*@
    
    @{
        ViewBag.Title = "Index";
    }
    
    <h2>Index</h2>
    
    <p>Hello from our View Template!</p> 

    可以使用 Layout 属性设置不同的布局视图,或将它设置为 null,这样将不会使用任何布局文件。

    现在,让我们更改索引视图的标题。

    打开MvcMovieViewsHelloWorldIndex.cshtml 有两个位置可进行更改:第一种是在浏览器的标题中显示的文本,然后是辅助标头(<h2> 元素)中的文本。 稍稍对它们进行一些更改,这样可以看出哪一段代码更改了应用的哪部分。

    @{
        ViewBag.Title = "Movie List";
    }
    
    <h2>My Movie List</h2>
    
    <p>Hello from our View Template!</p> 

    若要指示要显示的 HTML 标题,上面的代码将设置 ViewBag 对象(在索引. cshtml视图模板中)的 Title 属性。 请注意,布局模板( ViewsShared\_Layout )在 <title> 元素中使用此值作为之前修改的 HTML 的 <head> 部分。

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>@ViewBag.Title - Movie App</title>
        @Styles.Render("~/Content/css")
        @Scripts.Render("~/bundles/modernizr")
    </head> 

    使用此 ViewBag 方法,可以轻松地在视图模板和布局文件之间传递其他参数。

    运行该应用程序。 请注意,浏览器标题、主标题和辅助标题已更改。 (如果没有在浏览器中看到更改,则可能正在查看缓存的内容。 在浏览器中按 Ctrl + F5 来强制加载来自服务器的响应。)浏览器标题是通过在Index. cshtml视图模板中设置的 ViewBag.Title 创建的,而其他 "电影应用" 添加到布局文件中。

    另请注意, Index. view 模板中的内容是如何与 _Layout视图模板合并的,并向浏览器发送单个 HTML 响应。 凭借布局模板可以很容易地对应用程序中所有页面进行更改。

    不过,我们的 "数据" (在这种情况下,我们的视图模板!" 消息中的 "Hello)是硬编码的。 MVC 应用程序有一个 "V" (视图),并且你有 "C" (控制器),但没有 "M" (模型)。 稍后,我们将演练如何创建数据库并从中检索模型数据。

    二、将数据从控制器传递给视图

    不过,在开始使用数据库并讨论模型之前,首先请讨论将信息从控制器传递到视图。 为了响应传入 URL 请求,将调用控制器类。 通过控制器类,您可以编写处理传入浏览器请求的代码,从数据库中检索数据,并最终决定要发送回浏览器的响应类型。 然后,可以从控制器使用视图模板来生成 HTML 响应并设置其格式。

    控制器负责提供所需的任何数据或对象,以便视图模板呈现对浏览器的响应。 最佳做法:视图模板不应执行业务逻辑或直接与数据库交互 相反,视图模板应仅适用于控制器为其提供的数据。 保持此 "分离关注点" 有助于使你的代码更干净、可测试、更易于维护。

    当前,HelloWorldController 类中的 Welcome 操作方法采用 namenumTimes 参数,然后将值直接输出到浏览器。 不要让控制器将此响应呈现为字符串,而是将控制器改为使用视图模板。 视图模板将生成动态响应,这意味着你需要将适当的数据位从控制器传递给视图以生成响应。 为此,可以让控制器将视图模板所需的动态数据(参数)放置在视图模板可以访问 ViewBag 对象中。

    返回到HelloWorldController.cs文件,更改 Welcome 方法,将 MessageNumTimes 值添加到 ViewBag 对象。 ViewBag 是动态对象,这意味着你可以将所需的任何内容放在其中:在将对象放入其中之前,ViewBag 对象没有定义的属性。 ASP.NET MVC 模型绑定系统自动将命名参数(namenumTimes)从地址栏中的查询字符串映射到方法中的参数。 完整的 HelloWorldController.cs 文件如下所示:

    using System.Web;
    using System.Web.Mvc;
    
    namespace MvcMovie.Controllers
    {
        public class HelloWorldController : Controller
        {
            public ActionResult Index()
            {
                return View();
            }
    
            public ActionResult Welcome(string name, int numTimes = 1)
            {
                ViewBag.Message = "Hello " + name;
                ViewBag.NumTimes = numTimes;
    
                return View();
            }
        }
    } 

    现在 ViewBag 对象包含将自动传递到该视图的数据。 接下来,需要一个欢迎视图模板! 在 "生成" 菜单中,选择 "生成解决方案" (或按 Ctrl + Shift + B),以确保项目已编译。 右键单击ViewsHelloWorld文件夹,单击 "添加",然后单击 "带有布局的 MVC 5 视图页(Razor) "。

    在 "指定项目的名称" 对话框中,输入 "欢迎",然后单击 "确定"

    在 "选择布局页" 对话框中,接受默认 _Layout ,然后单击 "确定"

    将创建MvcMovieViewsHelloWorldWelcome.cshtml文件。

    替换欢迎的 cshtml文件中的标记。 你将创建一个循环,该循环显示 "Hello" 用户应尽可能多地显示。 下面显示了完整的欢迎. cshtml文件。

    @{
        ViewBag.Title = "Welcome";
    }
    
    <h2>Welcome</h2>
    
    <ul>
        @for (int i = 0; i < ViewBag.NumTimes; i++)
        {
            <li>@ViewBag.Message</li>
        }
    </ul> 

    运行应用程序并浏览到以下 URL:

    http://localhost:xx/HelloWorld/Welcome?name=Scott&numtimes=4

    现在,数据是从 URL 获取的,并使用模型绑定器传递到控制器。 控制器将数据打包到 ViewBag 对象中,并将该对象传递给视图。 然后,视图将以 HTML 格式向用户显示数据。

    在上面的示例中,我们使用 ViewBag 对象将数据从控制器传递到视图。 稍后在本教程中,我们将使用视图模型将数据从控制器传递给视图。 用于传递数据的视图模型方法通常比查看包方法更可取。 有关详细信息,请参阅博客文章动态 V 强类型视图

    嗯,这是模型的 "M",而不是数据库类型。 让我们用学到的内容来创建一个电影数据库。

  • 相关阅读:
    python 环境搭建
    马后炮之12306抢票工具(四)--抢票Demo,2014年1月9日终结版
    Office2013插件开发Outlook篇(2)-- Ribbon
    Office2013插件开发Outlook篇(1)-- 第一个office2013插件
    ExtJS4随笔(1) -- 在VS中加入Ext4的智能提示
    PHP中使用CURL请求页面,使用fiddler进行抓包
    微博公众平台(二)-- Token验证代码
    微博公众平台(一)-- 开发者接口配置信息
    cookie介绍
    jquery--工具插件
  • 原文地址:https://www.cnblogs.com/springsnow/p/13262958.html
Copyright © 2011-2022 走看看