zoukankan      html  css  js  c++  java
  • ASP.NET MVC编程——视图

    1Razon语法

    使用@符号后接C#或VB.NET语句的方式。

    基本规则

    1)变量

    @后直接变量即可

    2)代码块

    为使用表达式或多行代码,@后跟大括号将多行代码包括在大括号中

    3)“+”

    对于加号连接的两个字符串变量或属性,使用小括号将他们括起来

    4)插入HTML或文字

    每一行前面加上“@:”

    5)使用注释

    使用@*和*@将要注释的部分包起来

    6)用@@在页面上显示@

    @using

    在一个View中引入此页所需程序集的命名空间。

    还可以在web.config中配置命名空间,不过将对所有的View起作用。

    <system.web.webPages.razor>
        <pages pageBaseType="System.Web.Mvc.WebViewPage">
          <namespaces >
            <add namespace="System.Web.Mvc"/>
            <add namespace="WebApplication.Models"/>
          </namespaces>
        </pages>
    </system.web.webPages.razor>

    @model

    指定页面所用模型的类型。

    @help

    使用自定义函数。这种方法有可能将一部分数据处理逻辑放到了页面中,所以尽量不用。

    例子:

    定义函数

    @helper CheckHelp(int i1,int i2)
     {
            if (i1 > i2)
            {
                 @i1
            }
            else
            {
                @i2 
            }
    }

    使用函数

    <h3>@CheckHelp(10,1111)</h3>

     

    @functions

    定义一个方法供当前页使用,若使用IHtmlString作为方法的返回值,则可将其回传给当前页。

    例子:

    定义函数

    @functions 
    {
            public int CheckFunc(int i1, int i2)
            {
                if (i1 > i2)
                {
                 return i1;
                }
                else
                {
                    return i2;
                }
            }
    }

    使用函数

    <h3>@CheckFunc(10, 12111)</h3>

    2 HTML辅助方法

    使用方式为@后跟辅助方法,注意没有“;”,否则分号也会显示在页面上。

    2.1输出超链接

    ActionLink

    有几个重载方法,选参数最多的一个

    public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, string protocol, string hostName, string fragment, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes);

    linkText超连接名称

    actionName操作名称

    controllerName控制器名称

    protocolURL 协议,如“http”或“https”。

    hostNameURL 的主机名

    fragmentURL 片段名称(定位点名称)

    routeValues路由参数

    htmlAttributesHTML 特性

    例:

    @Html.ActionLink("一个连接", "About")

    对应的html代码

    <a href="/MVCPointApp/Home/About">一个连接</a>

    RouteLink

    有几个重载方法,选参数最多的一个

    public static MvcHtmlString RouteLink(this HtmlHelper htmlHelper, string linkText, string routeName, string protocol, string hostName, string fragment, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes);

    routeName路由名称

    其他参数同ActionLink

    2.2输出表单

    Html.BeginForm

    输出表单

    Html.EndForm

    结束表单

    Html.TextArea

    @Html.TextArea("Account","输入内容");

    对应的Html:

    <textarea cols="20" id="Account" name="Account" rows="2">输入内容</textarea>

    Html.TextBox

    <input type=”text”>

    Html.Label

    <lable>

    Html.Password

    <input type=”password”>

    Html.CheckBox

    <input type=”checkbox”>

    Html.RadioButton

    <input type=”radio”>

    Html.DropDownList

    <select>

    Html.ListBox

    <select multiple>

    Html.Hidden

    <input type=”hidden”>

    Html.Row

    输出不经过编码的内容

    Html.ValidationSummary

    数据模型验证失败时显示的数据信息,配合Html.BeginForm表单一起使用

    Html.ValidationMessage

    显示特定属性的验证信息

    Html.HttpMethodOverride

    用于模拟http动词

    Html.Id()

    输出特定栏位id

    Html.Name()

    输出特定栏位name

    Html.Value()

    输出特定栏位value

    还可以使用强类型的辅助方法,一般是以For结尾。

    1)显示属性验证信息

    控制器

    public ActionResult TestViewData(ModelF mf)
    {
                ViewData.Model = new ModelF { Field = mf.Field, Field2 = mf.Field2 };
                return View("Index");
    }

    模型

    public class ModelF
    {
            public string Field { get; set; }
    
            [Range(typeof(DateTime), "1/1/2018", "1/1/2019")]
            public DateTime Field2 { get; set; }
    }

    视图Index.cshtml

    @using (Html.BeginForm("TestViewData", "Home"))
    {
            @Html.ValidationSummary()
            <input id="filed" name="Field2" type="text" placeholder="请输入" value="" />
            <input type="submit" value="提交" />
    }

    测试,输入1/1/2020,执行结果为:

    为了能显示字段的中文名称使用DisplayName

    public class ModelF
    {
            public string Field { get; set; }
    
            [Range(typeof(DateTime), "1/1/2018", "1/1/2019")]
            [DisplayName("[这个字段]")]
            public DateTime Field2 { get; set; }
    }

    执行结果为

    2)设置标签特性值

    由于class是C#保留关键字,因此设置class特性时要使用@

    @using (Html.BeginForm("Login", "Account", FormMethod.Post, new { @class = "loginForm" }))
    {
         //其他代码  
     }

    HTML辅助方法会将下划线渲染为连字符,因此要表达含有连字符的特性,那么使用下划线

    Html.BeginForm("Login", "Account", FormMethod.Post, new { vla_input=true})

    2.3加载分部视图

    Html.Partial

    呈现分部视图,返回HTML

    Html.Action

    调用控制器操作呈现分部视图

    Html.RenderAction

    以内联的方式显示结果

    3 Url辅助方法

    返回URI字符串

    Url.Action

    <h1>@Url.Action("Indexx")</h1>

    输出HTML为:

    <h2>/MVCPointApp/Home/Indexx</h2>

    Url.HttpRouteUrl

    <a href="@Url.HttpRouteUrl("Default", new { id=2})">点击调用</a>

    输出HTML为:

    <a href="/MVCPointApp/Home/Index/2?httproute=True">点击调用</a>

    Url.RouteUrl

    <a href="@Url.RouteUrl("Default", new { id=2})">点击调用</a>

    输出HTML为:

    <a href="/MVCPointApp/Home/Index/2">点击调用</a>

     

    4 视图定位

    • 视图放在Views文件夹下
    • Views文件夹的子文件夹名称为控制器名称
    • 视图名称可以是控制器操作方法名称也可以不是,若不是控制器操作方法名称,控制器返回视图时要指定视图名。
    • Views文件夹下的Shared保存多个控制器共享的视图

    视图定位规则是,先在Views文件夹中找对应控制器及控制器方法的视图,没有找到就到Shared文件夹下找。

    5页面布局

    • Views文件夹下_ViewStart.cshtml文件指定默认的模板,这个视图先于任何试图运行。
    • 使用WebPageBase.Layout加载布局模板
    • 使用@Html.Partial帮助方法加载部分视图
    • 使用@section定义指定内容的节,然后使用WebPageBase.RenderSection加载指定的节,使用public HelperResult RenderSection(string name, bool required);required=true,那么节必须已经定义,否则抛异常。
    • @Styles.Render@Scripts.Render捆绑和压缩css、js

    捆绑和压缩css与js

    App_Start文件夹下BundleConfig类中

    public static void RegisterBundles(BundleCollection bundles)
    {
        //多个文件用逗号分隔
        bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                            "~/Scripts/jquery.cookie.js",
                            "~/Scripts/jquery.hoverDelay.js",
                            "~/Scripts/jquery.pagination.js",
                            "~/Scripts/jquery.form.js",
                            "~/Scripts/json2.js",
                            "~/Scripts/hydss.js",
                            "~/Scripts/hydss.utility.js"));
    
        bundles.Add(new StyleBundle("~/Content/css/base").Include(
                                            "~/Content/css/common.css",
                                            "~/Content/css/dev.css"));
    }

    页面中使用已经捆绑并压缩的css和js,使用规则是:css文件置顶、js文件置地

    @Styles.Render("~/Content/css/base")

    @Scripts.Render("~/bundles/jqueryval")

    覆盖默认布局模板

    使用WebPageBase.Layout加载模板覆盖_ViewStart.cshtml文件指定默认的模板

    例如:

    _ViewStart.cshtml文件如下

    @{

        Layout = "~/Views/Shared/_Layout.cshtml";

    }

    Index.cshtml文件如下

    @{

        ViewBag.Title = "Home Page";

        Layout = "~/Views/Shared/_LayoutOther.cshtml";

    }

    <div class="jumbotron">

    @*具体内容*@

    </div>

    如果没有Layout = "~/Views/Shared/_LayoutOther.cshtml";这行代码,那么此视图文件将使用_ViewStart.cshtml中的_Layout.cshtml这个模板,但这里Index.cshtml文件使用的是另一个模板_LayoutOther.cshtml

    使用实例

    实际项目中可能会有不止一种布局,针对多种布局,既能满足这种需求要能尽可能地代码复用。

    创建父模板_Layout.cshtml

    <!DOCTYPE html>
    <html>
    <head>
        <title>@ViewBag.Title</title>
        <link rel="icon" href="~/favicon.ico" />
        <link rel="shortcut Icon" href="~/favicon.ico" />
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta http-equiv="imagetoolbar" content="no" />
        <meta name="apple-mobile-web-app-capable" content="yes" />
        <meta name="keywords" content="词1 词2" />
        <meta name="description" content="网站的主题" />
        @Styles.Render("~/Content/css/base")
    @Scripts.Render("~/bundles/jquery")
    @*加载HeaderSection节*@
        @RenderSection("HeaderSection", false)
    </head>
    
    <body>
        @*加载主体*@
        @RenderBody()
    
        <img id="loading" style="display:none;position:fixed;top:50%;left:50%;" src="@Url.Content("~/Content/images/loading.gif")" title="加载中..." alt="加载中..." />
        <a href="javascript:void(0);" id="backToTop" title="回到顶部"></a>
        @*加载脚本*@
        @Scripts.Render("~/bundles/jqueryval")
        @*加载FooterSection节*@
    @RenderSection("FooterSection", false)
    </body>
    </html>

    创建子模板_LayoutOther.cshtml

    @{
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    
    @*定义HeaderSection节*@
    @section HeaderSection{
        @RenderSection("HeaderSection", false)
    }
    
    @*加载页头*@
    @Html.Partial("_header")
    @*加载主体*@
    @RenderBody()
    @*加载页脚*@
    @Html.Partial("_footer")
    @*定义FooterSection节*@
    @section FooterSection{
        @RenderSection("FooterSection", false)
    }

    分析

    _LayoutOther.cshtml视图使用了_Layout.cshtml视图文件,_Layout.cshtml@RenderSection来加载FooterSectionHeaderSection节,而这个节定义在_LayoutOther.cshtml中,不过没有具体内容;_LayoutOther.cshtml中定义的FooterSectionHeaderSection又各自加载其他也面定义的FooterSectionHeaderSection节,所以可以在使用_LayoutOther.cshtml中灵活定义FooterSectionHeaderSection节,可以想象这样一个场景,每个页面都需要加载js文件,而他们既有共用的js文件,又有非共用的js文件,那么可以在使用_LayoutOther.cshtml的视图中定义section 节来加载只有此页面使用的js文件,而把公共的js文件放在_Layout.cshtml视图文件中

    例如Index.cshtml定义@section FooterSection{

        @Scripts.Render("~/bundles/index")

    }

    这个节加载只供Index.cshtml这个页面实用的js,这样其他不需要这个js的页面就不必加载这个js,从而达到减少页面加载文件的目的进而优化了页面。

    6加载分部视图

    1)控制器返回分部视图

    配合@Html.Action方法使用控制器操作返回分部视图

    视图中使用@Html.Action("TestPy"),控制器如下

    public ActionResult TestFrom()
    {
          return PartialView("TestPy");
    }

    或者在视图中使用@{Html.RenderAction("TestPy");},注意这种内联视图和Html.Action使用的区别。

    2)使用html帮助方法

    使用Html.Partial直接调用部分视图而不是通过控制器操作方法。

    @Html.Partial("_header")

    7视图向控制器传递数据

    1)使用表单向控制器传递数据

    视图代码

    @using (Html.BeginForm("TestFrom", "Home"))
        {
            <input id="UserName" name="UserName" type="text" placeholder="请输入用户名" value="" />
            <input id="Password" name="Password" type="password" placeholder="请输入密码" value="" />
            <input type="submit" value="提交"/>
    }

    控制器代码

    public ActionResult TestFrom(FormCollection c)
    {
                var un = c["UserName"];
                var pw = c["Password"];
                ViewBag.Un = un;
                ViewBag.Pw = pw;
                return PartialView("TestPy");
    }

    2)通过路由参数向控制器传递数据

    8自定义html辅助方法

    返回值类型为IHtmlStringIHtmlString 是一个接口

    public static IHtmlString HYSubString(this HtmlHelper helper, string param)
    {
         //字符串
         String ret =......
          return helper.Raw(ret);
    }

    参考:

    1.Jess Chadwick/Todd Snyder/Hrusikesh Panda,徐雷/徐扬

    译。ASP.NET MVC4 Web编程

    2.Jon Galloway/Phil Haack/Brad Wilson/K. Scott Allen,孙远帅/邹权译  ASP.NET MVC4 高级编程(第四版)

    3.黄保翕,ASP.NET MVC4开发指南

    4.蒋金楠,ASP.NET MVC4框架揭秘

    5.https://www.asp.net/mvc

    -----------------------------------------------------------------------------------------

    转载与引用请注明出处。

    时间仓促,水平有限,如有不当之处,欢迎指正。

  • 相关阅读:
    作业2 求题目中的数
    2013 C#单元测试
    实现项目WC
    带括号多项式版四则运算
    20道简单加减法随机生成程序扩展版体会
    20道简单加减法随机生成程序
    Jeesite 集成微信支付接口
    第一节:JAVA 语言的学习目标
    vector(未完)
    关于phpstorm端口63342的修改经历
  • 原文地址:https://www.cnblogs.com/hdwgxz/p/8629788.html
Copyright © 2011-2022 走看看