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. JavaScript基础教程2-20160612

    1.JavaScript之操作html元素,Dom Dom是抽象出来的网页对象,需要了解面向对象的思想:调用对象下的方法实现相应的功能 使用JS调用dom来创建标签. //document是网页对象 ...

  2. 借助TZImagePickerController三方库理解自定义相册

    借助TZImagePickerController三方库理解自定义相册 1.整体架构分析 整体框架大致可以分为几个部分 <1>工具类-TZImageManager:这个类主要是工作是提供一 ...

  3. 自动提取文章摘要AutoSummary

    在文本搜索引擎项目中,需要对已排序的文章进行摘要提取,然后与标题,路径一起封装成Json数据返回客户端.因此这里我自己写一个自动摘要,来大概完成这个任务.在自动摘要提取过程中,使用了一个分词库:Cpp ...

  4. PCI和PCIE插槽有什么区别?

    PCI是Peripheral Component Interconnect(外设部件互连标准)的缩写,它是目前个人电脑中使用最为广泛的接口,几乎所有的主板产品上都带有这种插槽.PCI插槽也是主板带有最 ...

  5. uclibc和glibc的差别

    uClibc和Glibc并不相同,两者有许多不同之处,而且以下不同有可能给你带来一些问题. 1. uClibc比Glibc小,虽然uClibc和Glibc在已有的接口上是兼容的,而且采用uClibc编 ...

  6. Java Web项目部署Tomcat运行出错

    1.在部署Java Web项目的过程中,启动Tomcat出现报错提示 具体报错如下: Could not load the Tomcat server configuration at \Server ...

  7. R语言自动化报告格式——knitr

    R语言自动化报告格式--knitr 相关文献: R语言自动化报告格式--knitr 资讯 | R Notebooks 即将发布 ------------------------------------ ...

  8. 【mongodb系统学习之四】查看mongodb进程

    四.查看mongodb进程(可以配合启动和关闭使用): 1).方法一:直接查看mongodb进程是否已经存在(用上面的方式启动后,需要另开一个窗口操作):ps –ef|grep mongodb, 如图 ...

  9. C#数据缓存介绍及Caching通用帮助类整理

    C#缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能. 以下为 ...

  10. devDependencies和dependencies的版本写法

    devDependencies和dependencies的版本写法 指定版本:比如1.2.2,遵循大版本.次要版本.小版本的格式规定,安装时只安装指定版本. 波浪号(tilde)+指定版本:比如~1. ...