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
-----------------------------------------------------------------------------------------
转载与引用请注明出处。
时间仓促,水平有限,如有不当之处,欢迎指正。
ASP.NET MVC编程——视图的更多相关文章
- ASP.NET MVC 编程参考
ASP.NET MVC 编程参考 转载请注明出处:http://surfsky.cnblogs.com MVC 参考 http://msdn.microsoft.com/zh-cn/dd40 ...
- ASP.NET MVC 5 - 视图
在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML. 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所 ...
- asp.net mvc 部分视图加载区别
ASP.NET MVC 部分视图 ASP.NET(11) 版权声明:本文为博主原创文章,未经博主允许不得转载. [部分视图] ASP.NET MVC 里的部分视图,相当于 Web Form 里的 ...
- [转]ASP.NET MVC 5 - 视图
在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML. 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所 ...
- Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html
Asp.net MVC Razor视图模版动态渲染PDF,Razor模版生成静态Html 1.前言 上一篇文章我开源了轮子,Asp.net Core 3.1 Razor视图模版动态渲染PDF,然后,很 ...
- ASP.NET MVC编程——控制器
每一个请求都会经过控制器处理,控制器中的每个方法被称为控制器操作,它处理具体的请求. 1操作输入参数 控制器的操作的输入参数可以是内置类型也可以是自定义类型. 2操作返回结果 结果类型 调用方法 备注 ...
- ASP.NET MVC编程——模型
1 ViewModel 是一种专门提供给View使用的模型,使用ViewModel的理由是实体或领域模型所包含的属性比View使用的多或少,这种情况下实体或领域模型不适合View使用. 2模型绑定 默 ...
- ASP.NET MVC编程——错误处理与日记
ASP.NET MVC的错误处理应考虑到这几个方面:模型绑定期间发生的错误,未能路由到指定操作,针对控制器的错误处理.使用配置文件可以帮助我们处理异常,但是不够灵活和全面:使用HandleErrorA ...
- ASP.NET MVC编程——单元测试
1自动化测试基本概念 自动化测试分为:单元测试,集成测试,验收测试. 单元测试 检验被测单元的功能,被测单元一般为低级别的组件,如一个类或类方法. 单元测试要满足四个条件:自治的,可重复的,独立的,快 ...
随机推荐
- kubernetes 命令使用
学会命令的查找和使用,而不是死记命令,记命令不如提高英文水平 1.kubernetes环境搭建完成后,kubernetes环境搭建参考http://www.cnblogs.com/sosogengdo ...
- hive:框架理解
1. 什么是hive •Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. •本质是将HQL转换为MapReduce程序 2. 为什么 ...
- java 集合框架(十五)Deque
一.概述 Deque是Queue的子接口,我们知道Queue是一种队列形式,而Deque则是双向队列,它支持从两个端点方向检索和插入元素,因此Deque既可以支持LIFO形式也可以支持LIFO形式.D ...
- 关于服务器的CPU的几个概念学习总结
物理CPU 物理CPU: 物理CPU是指插在主板上面的CPU芯片.即指在主板上肉眼能看到的CPU的个数.一般而言,个人台式机或笔记本上只会有一个物理CPU芯片.而服务器主板上往往有多个物理CPU. L ...
- JVM 指令
1.Demo 2.Class 文件说明 2.1 Class文件结构 2.2 jvm type, method signature 2.3 泛型表示 3.方法说明 3.1 方法结构 3.1.1 Thre ...
- Davinci DM6446开发攻略——LINUX GPIO驱动源码移植
一. DM6446 GPIO的介绍 说到LINUX 驱动移植,没有移植过的朋友,或刚刚进入LINUX领域的朋友,最好去看看<LINUX 设备驱动程序>第三 ...
- directdraw显示yuv422(yuy2)
#include <mmsystem.h> void CshowpicDlg::OnBnClickedButton3() { // TODO: 在此添加控件通知处理程序代码 height ...
- Java中的i++和i--
/** * @Title:DataCate.java * @Package:com.you.dao * @Description:数据类型转换 * @Author: 游海东 * @date: 2014 ...
- Windows 7 Visual Studio 2008配置OpenGL开发环境
Windows 7 Visual Studio 2008配置OpenGL开发环境 glut下载地址: http://www.opengl.org/resources/libraries/glut/gl ...
- Windows控制台下绘制简单图形
最近接触到一个很有意思的问题,如何在Windows控制台下画图,翻遍了C的头文件也没找到画图的函数,好吧,那就用Windows提供的API函数吧,看来想移植是没戏了.先画一个简单的图,类似心电图那种吧 ...