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:控制器名称

protocol:URL 协议,如“http”或“https”。

hostName:URL 的主机名

fragment:URL 片段名称(定位点名称)

routeValues:路由参数

htmlAttributes:HTML 特性

例:

@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来加载FooterSection和HeaderSection节,而这个节定义在_LayoutOther.cshtml中,不过没有具体内容;_LayoutOther.cshtml中定义的FooterSection和HeaderSection又各自加载其他也面定义的FooterSection和HeaderSection节,所以可以在使用_LayoutOther.cshtml中灵活定义FooterSection和HeaderSection节,可以想象这样一个场景,每个页面都需要加载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辅助方法

返回值类型为IHtmlString,IHtmlString 是一个接口

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

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

转载与引用请注明出处。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hotqin888的专栏

web html页面显示autocad等dwg格式图形文件方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

5172
来自专栏令仔很忙

机房收费系统——VB将MSHflexgrid控件中的数据导出为Excel

 在做机房收费系统的时候,许多窗体用到的一个功能,就是将从数据库中提取出来的数据导出到Excel中。

811
来自专栏nice_每一天

一天带你入门到放弃vue.js(二)

至此在vue中提供了计算属性,computed,在main.js指定computed对象中指定计算

1091
来自专栏james大数据架构

在ASPNET中使用JS集锦

(一).确认删除用法: 1. BtnDel.Attributes.Add("onclick","return confirm('"+"确认删除?"+"')")...

2147
来自专栏DannyHoo的专栏

问题——持续更新

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

832
来自专栏Coding迪斯尼

实现盒子动画和键盘特效

1022
来自专栏数据结构笔记

Django搭建博客(七):form的使用

不过 form只提供输入框,外层的 form标签和提交按钮都需要自己添加,我们加上 form标签和提交按钮看看:

1453
来自专栏听雨堂

Log4Net与Log2Console配合时中文问题的解决

二者搭配,非常好用,但必须要用log4net.Layout.XmlLayoutSchemaLog4j才能有效果:区分不同的级别,把不同的属性列都显示出来… ...

2357
来自专栏彭湖湾的编程世界

【Vue】Vue中的父子组件通讯以及使用sync同步父子组件数据

前言: 之前写过一篇文章《在不同场景下Vue组件间的数据交流》,但现在来看,其中关于“父子组件通信”的介绍仍有诸多缺漏或者不当之处, 正好这几天学习了关于用sy...

92610
来自专栏菩提树下的杨过

Flash/Flex学习笔记(3):动态添加组件

Flash中一个fla文件可以关联到一个as文件,这个有点类似于asp.net中的code behind. 可参考以下图操作: ? ? ? 注: 1.as文件...

2158

扫码关注云+社区

领取腾讯云代金券