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",而不是数据库类型。 让我们用学到的内容来创建一个电影数据库。

  • 相关阅读:
    POJ3320 Jessica's Reading Problem
    POJ3320 Jessica's Reading Problem
    CodeForces 813B The Golden Age
    CodeForces 813B The Golden Age
    An impassioned circulation of affection CodeForces
    An impassioned circulation of affection CodeForces
    Codeforces Round #444 (Div. 2) B. Cubes for Masha
    2013=7=21 进制转换
    2013=7=15
    2013=7=14
  • 原文地址:https://www.cnblogs.com/springsnow/p/13262958.html
Copyright © 2011-2022 走看看