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

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

转载与引用请注明出处。

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

ASP.NET MVC编程——视图的更多相关文章

  1. ASP.NET MVC 编程参考

    ASP.NET MVC 编程参考   转载请注明出处:http://surfsky.cnblogs.com MVC    参考 http://msdn.microsoft.com/zh-cn/dd40 ...

  2. ASP.NET MVC 5 - 视图

    在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML. 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所 ...

  3. asp.net mvc 部分视图加载区别

    ASP.NET MVC 部分视图   ASP.NET(11)  版权声明:本文为博主原创文章,未经博主允许不得转载. [部分视图] ASP.NET MVC 里的部分视图,相当于 Web Form 里的 ...

  4. [转]ASP.NET MVC 5 - 视图

    在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML. 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所 ...

  5. Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html

    Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html 1.前言 上一篇文章我开源了轮子,Asp.net Core 3.1 Razor视图模版动态渲染PDF,然后,很 ...

  6. ASP.NET MVC编程——控制器

    每一个请求都会经过控制器处理,控制器中的每个方法被称为控制器操作,它处理具体的请求. 1操作输入参数 控制器的操作的输入参数可以是内置类型也可以是自定义类型. 2操作返回结果 结果类型 调用方法 备注 ...

  7. ASP.NET MVC编程——模型

    1 ViewModel 是一种专门提供给View使用的模型,使用ViewModel的理由是实体或领域模型所包含的属性比View使用的多或少,这种情况下实体或领域模型不适合View使用. 2模型绑定 默 ...

  8. ASP.NET MVC编程——错误处理与日记

    ASP.NET MVC的错误处理应考虑到这几个方面:模型绑定期间发生的错误,未能路由到指定操作,针对控制器的错误处理.使用配置文件可以帮助我们处理异常,但是不够灵活和全面:使用HandleErrorA ...

  9. ASP.NET MVC编程——单元测试

    1自动化测试基本概念 自动化测试分为:单元测试,集成测试,验收测试. 单元测试 检验被测单元的功能,被测单元一般为低级别的组件,如一个类或类方法. 单元测试要满足四个条件:自治的,可重复的,独立的,快 ...

随机推荐

  1. kubernetes 命令使用

    学会命令的查找和使用,而不是死记命令,记命令不如提高英文水平 1.kubernetes环境搭建完成后,kubernetes环境搭建参考http://www.cnblogs.com/sosogengdo ...

  2. hive:框架理解

    1. 什么是hive  •Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. •本质是将HQL转换为MapReduce程序  2. 为什么 ...

  3. java 集合框架(十五)Deque

    一.概述 Deque是Queue的子接口,我们知道Queue是一种队列形式,而Deque则是双向队列,它支持从两个端点方向检索和插入元素,因此Deque既可以支持LIFO形式也可以支持LIFO形式.D ...

  4. 关于服务器的CPU的几个概念学习总结

    物理CPU 物理CPU: 物理CPU是指插在主板上面的CPU芯片.即指在主板上肉眼能看到的CPU的个数.一般而言,个人台式机或笔记本上只会有一个物理CPU芯片.而服务器主板上往往有多个物理CPU. L ...

  5. JVM 指令

    1.Demo 2.Class 文件说明 2.1 Class文件结构 2.2 jvm type, method signature 2.3 泛型表示 3.方法说明 3.1 方法结构 3.1.1 Thre ...

  6. Davinci DM6446开发攻略——LINUX GPIO驱动源码移植

    一.             DM6446 GPIO的介绍      说到LINUX 驱动移植,没有移植过的朋友,或刚刚进入LINUX领域的朋友,最好去看看<LINUX 设备驱动程序>第三 ...

  7. directdraw显示yuv422(yuy2)

    #include <mmsystem.h> void CshowpicDlg::OnBnClickedButton3() {  // TODO: 在此添加控件通知处理程序代码 height ...

  8. Java中的i++和i--

    /** * @Title:DataCate.java * @Package:com.you.dao * @Description:数据类型转换 * @Author: 游海东 * @date: 2014 ...

  9. Windows 7 Visual Studio 2008配置OpenGL开发环境

    Windows 7 Visual Studio 2008配置OpenGL开发环境 glut下载地址: http://www.opengl.org/resources/libraries/glut/gl ...

  10. Windows控制台下绘制简单图形

    最近接触到一个很有意思的问题,如何在Windows控制台下画图,翻遍了C的头文件也没找到画图的函数,好吧,那就用Windows提供的API函数吧,看来想移植是没戏了.先画一个简单的图,类似心电图那种吧 ...