ASP.NET MVC学习之视图篇(2)
4.HTML辅助器
虽然在ASP.NET MVC中我们已经摆脱了ASP.NET的控件,但是对于页面中需要循环标签的情况依然还是存在,可能很多人认为用foreach就可以完成,但是这个仅仅只是针对单个循环,如果多个循环中都要使用到同样的标签呢?下面笔者就介绍两种方式让我们事半功倍。
首先是针对单个页面的内联辅助器,如果我们遇到只要在单个页面中不断使用的标签的时候,这个方式非常的轻便,比如下面的代码根据文本内容和样式类生成li标签的辅助器(Views/Home/Index.cshtml中):
@helper CreateCssLi(String name,String css)
{
<li class="@css" >@name</li>
} <ul>
@foreach (var item in new[] { new { Name = "ADS", Css = "abs" }, new { Name = "adasd", Css = "afasf" } })
{
@CreateCssLi(item.Name, item.Css)
}
</ul>
这里我们使用了 @helper 生成了一个内联辅助器,并且在下面通过foreach使用了这个内联辅助器,虽然内联辅助器很轻便,但是对于需要在多个视图中使用时,需要在每个页面中写入@helper,所以下面我们还要介绍外部辅助器,能够让我们在不同的页面中也能够使用,我们将上面的内联辅助器改写成如下的外部辅助器:
首先我们新建一个Helper文件夹然后在其中新建一个HtmlHelperExt类,并在其中写入如下代码:
namespace MvcStudy.Helper
{
public static class HtmlHelperExt
{
public static MvcHtmlString CreateCssLi(this HtmlHelper s,String name,String css)
{
var li = new TagBuilder("li");
li.AddCssClass(css);
li.SetInnerText(name);
return new MvcHtmlString(li.ToString());
}
}
}
通过对HtmlHelper进行扩展,那么我们就可以在视图中通过@Html使用我们扩展的方法了,当然仅仅完成这步还不够,在Views的Web.config中添加这个命名空间:
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization"/>
<add namespace="System.Web.Routing" />
<add namespace="MvcStudy.Helper"/>
</namespaces>
</pages>
如果读者不想修改配置文件,也有另外一个方法,就是将HtmlHelperExt的namespace改成System.Web.Mvc,最后的效果都一样。
5.分段
相信很多从事ASP.NET的开发人员都使用过母版,而且我们会根据需要在母版中放入ContentPlaceHolder控件作为占位符,那么在最终的内容页面中就会生成同样多的Content控件,这样我们就可以灵活的对页面进行组合。当然这门技术在ASP.NET MVC中依然还是存在,当读者新建一个基本的ASP.NET MVC项目后都会自动的新建好一个母版页面,就是Views/Shared/Layout.cshtml,我们可以打开这个视图,可以发现 @RenderBody() 方法,这个方法其实就是整个内容页的占位符,当然大家一定会问那怎么实现跟ASP.NET一样的效果呢,这个时候分段上场,我们修改_Layout.cshtml的代码:
<body>
@RenderSection("head") @RenderBody() @RenderSection("foot")
@Scripts.Render("~/bundles/jquery")
@RenderSection("scripts", required: false)
</body>
这里通过调用@RenderSection输出内容页中的head段和foot段,剩下来我们修改Views/Home/Index.cshtml视图:
@section head{
<h1>来自head</h1>
} <h1>来自body</h1> @section foot{
<h1>来自foot</h1>
}
通过使用@section划分段,然后在其中就可以写入内容了,最后我们可以看到效果如下所示:
但是我们将Index.cshtml中删除一个分段后重新打开,就会报错。因为有时候我们内容页不需要在某个分段中写入内容,如果像上面这样就意味着即使不需要使用也要写这个分段,从而影响视图,当然这个也是有解决方案的,下面我们重新修改_Layout.cshtml页面:
<body>
@RenderSection("head") @RenderBody() @if(IsSectionDefined("foot"))
{
@RenderSection("foot")
}
else
{
<h1>默认的foot</h1>
} @Scripts.Render("~/bundles/jquery")
@RenderSection("scripts", required: false)
</body>
这里我们首先通过@IsSectionDefined判断某个分段是否存在,如果存在则输出,否则输出默认内容,但是我们发现这样还是有点麻烦,有时候我们并没有默认内容,如果不存在这个分段就不显示,所以我们还可以继续修改成如下所示:
<body>
@RenderSection("head") @RenderBody() @RenderSection("foot",false) @Scripts.Render("~/bundles/jquery")
@RenderSection("scripts", required: false)
</body>
我们仅仅在@RenderSection输入了第二个参数为false,这个参数的含义就是这个分段是否是可选。
6.分布视图
上面我们采用了两种辅助器都可以减少我们输入html的数量,但是并不能书写大量的html代码,所以我们还需要一中能够将大量html进行合并,以便视图中随时使用,这个时候我们就可以使用分布视图了,首先我们在Views/Shared下新建视图:
这个要勾选!
笔者的命名为PartialTest,然后我们可以在其中随意写什么。接着我们在Views/Home/Index.cshtml中使用这个分布视图:
@section head{
<h1>来自head</h1>
} <h1>来自body</h1> @Html.Partial("PartialTest")
最后我们看到最终的页面中输出了分布视图的内容。但是这种方式仅仅只能解决简单的功能,如果你的分布视图需要涉及到一点功能性的代码,那么它操作起来就比较麻烦了,所以下面我们还需要子动作的帮助。首先我们在Views/Home/Index中新建一个ChildAction视图(注意需要把Layout设置为NULL),然后在Home控制器中写入如下代码:
[ChildActionOnly]
public ActionResult ChildAction()
{
ViewBag.Msg = "来自子动作";
return View();
}
同时我们还需要修改Views/Home/Index视图中的代码如下:
@section head{
<h1>来自head</h1>
} <h1>来自body</h1> @Html.Action("ChildAction")
这里注意我们使用的是@Html.Action而不是@Html.Partial,然后我们重新build下然后刷新页面就可以看到子动作的内容了:
关于ASP.NET MVC自带的Html辅助器笔者这里就不介绍了,因为相关的教程很多,而且使用很快就能上手,至此ASP.NET MVC的视图部分就到此为止了。
ASP.NET MVC学习之视图篇(2)的更多相关文章
- ASP.NET MVC学习之视图篇(1)
一.前言 不知道还有多少读者从第一篇开始一直学习到如今,笔者也会一直坚持将ASP.NET MVC的学习完美的结束掉,然后开始写如何配合其他框架使用ASP.NET MVC的随笔.当然笔者后面的随笔如果没 ...
- ASP.NET MVC学习之过滤器篇(2)
下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...
- ASP.NET MVC学习之控制器篇扩展性
原文:ASP.NET MVC学习之控制器篇扩展性 一.前言 在之前的一篇随笔中已经讲述过控制器,而今天的随笔是作为之前的扩展. 二.正文 1.自定义动作方法 相信大家在开发过程一定会遇到动作方法的重名 ...
- ASP.NET MVC学习之控制器篇
一.前言 许久之后终于可以继续我的ASP.NET MVC连载了,之前我们全面的讲述了路由相关的知识,下面我们将开始控制器和动作的讲解. ASP.NET MVC学习之路由篇幅(1) ASP.NET MV ...
- ASP.NET MVC学习之过滤器篇(1)
一.前言 继前面四篇ASP.NET MVC的随笔,我们继续向下学习.上一节我们学习了关于控制器的使用,本节我们将要学习如何使用过滤器控制用户访问页面. 二.正文 以下的示例建立在ASP.NET MVC ...
- ASP.NET MVC学习之控制器篇(二)
原文链接:http://www.asp.net/learn/mvc/ 这篇教程探索了ASP.NET MVC控制器(controller).控制器动作(controller action)和动作结果(a ...
- ASP.NET MVC学习之路由篇(3)
根据路由输出链接 既然是网站开发自然少不了链接,我们已经学会了强大的路由,但是还缺少一步就是能够将这些路由的路径输出到页面,下面我们就开始学习如何输出路由路径. 首先我们的路由注册部分如下所示: 1 ...
- ASP.NET MVC学习之路由篇(2)
7.解决与物理路径的冲突 当发送一个请求至ASP.NET MVC时,其实会检查网站中存不存在这个请求的物理路径文件,如果存在的话,就会直接将这个物理文件返回.但是有时候我们需要它执行控制器的某个方法, ...
- ASP.NET MVC学习之路由篇(1)
1.基本路由 RouteConfig.cs: 1 public class RouteConfig 2 { 3 public static void RegisterRoutes(RouteColle ...
随机推荐
- NHibernate系列文章二:创建NHibernate工程
摘要 这篇文章介绍了如何创建一个简单的使用NHibernate的控制台应用程序,包括使用NuGet.简单的配置.单表映射.对NHibernate配置文件添加智能提示.使用ISessionFactory ...
- oracle net manager的配置文件tnsnames.ora位置
配置文件所在的路径:C:\app\Ling-PC\product\11.2.0\client_1\network\admin (红色为安装的盘符位置)
- XidianOJ 1172 Hiking
题目描述 BlacKin and GKCY are going hiking together. Besides their personal items, there are some items ...
- CSS声明顺序
CSS对元素样式进行声明,虽然一条规则中的声明可以按照任何顺序写出来,但是还是应该有个优先级的顺序. 如下的声明顺序摘抄自<CSS设计指南>,优先级顺序如下: display及相关声明 p ...
- JavaIDL开发CORBA实例演示
转载 http://www.micmiu.com/opensource/corba/corba-javaidl-dev-demo/
- Installshield 打包安装包心得
制作简单的安装软件 声明:下面的教程,是把读者当做完全没接触过IS的角度来制作的. 1. 启动InstallShield 12.建立一个InstallShield MSI Project,如图: 2 ...
- 手机抓包xcode自带命令行工具配合wireshark实现
三.最佳方式:rvictl命令 优点:简单,而且可以抓所有网络接口的数据: 缺点:似乎没有,要求手机iOS5以上不算要求吧?如果说缺点,就是这个命令是Xcode的Command Line Tools ...
- 【Python全栈笔记】00 12-14 Oct Linux 和 Python 基础
Linux 基础认识 更加稳定,安全,开源 设置好ssh协议后可以通过windows系统连接Linux,基于ssh协议进行通信 '/' 为根目录 cd / -> 切换到根目录 ls -lh 列出 ...
- LeetCode OJ 274. H-Index
Given an array of citations (each citation is a non-negative integer) of a researcher, write a funct ...
- 转发(request.setRequestDispacter)和重定向(response.sendRedirect)的区别以及转发的include和forward的区别
//response 重定向的时候,url是会跳转到新的页面的,输入的地址要包含项目名(可以跳到项目之外的页面,比如百度)//request 请求转发的时候,url是不会跳转到新页面的,输入的地址不包 ...