您好,欢迎访问一九零五行业门户网

[ASP.NET MVC 小牛之路]12

[asp.net
mvc 小牛之路]12 - section、partial view 和 child action
概括的讲,view中的内容可以分为静态和动态两部分。静态内容一般是html元素,而动态内容指的是在应用程序运行的时候动态创建的内容。给view添加动态内容的方式可归纳为下面几种:
inline code,小的代码片段,如 if 和 foreach 语句。
html helper方法,用来生成单个或多个html元素,如view model、viewbag等。
section,在指定的位置插入创建好的一部分内容。
partial view,存在于一个单独的视图文件中,作为子内容可在多个视图中共享。
child action,相当于一个包含了业务逻辑的ui组件。当使用child action时,它调用 controller 中的 action 来返回一个view,并将结果插入到输出流中。
这个分类不是绝对的。前两种很简单,在前面的文章中也使用过。本文主要介绍后三种方式的应用。
本文目录
section
razor视图引擎支持将view中的一部分内容分离出来,以便在需要的地方重复利用,减少了代码的冗余。下面来演示如何使用section。
创建一个mvc应用程序,选择基本模板。添加一个homecontroller,编辑生成的index方法如下:
public actionresult index() { string[] names = { "apple", "orange", "pear" }; return view(names); }
右击index方法,添加视图,编辑该视图如下:
@model string[] @{ viewbag.title = "index"; } @section header { <div class="view"> @foreach (string str in new [] {"home", "list", "edit"}) { @html.actionlink(str, str, null, new { style = "margin: 5px" }) } </div> } <div class="view"> this is a list of fruit names: @foreach (string name in model) { <span><b>@name</b></span> } </div>@section footer { <div class="view"> this is the footer </div> }
我们通过@section标签加section的名称来定义一个section,这里创建了两个section:header 和 footer,习惯上一般把section放在view文件的开头或结尾以方便阅读。下面我们在 /views/shared/_layout.cshtml 文件中来使用它们。
编辑 /views/shared/_layout.cshtml 文件如下:
<!doctype html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width" /> <style type="text/css"> div.layout { background-color: lightgray;} div.view { border: thin solid black; margin: 10px 0;} </style> <title>@viewbag.title</title> </head> <body> @rendersection("header") <div class="layout"> this is part of the layout </div> @renderbody() <div class="layout"> this is part of the layout </div> @rendersection("footer") <div class="layout"> this is part of the layout </div> </body> </html>
我们通过 @rendersection 方法来调用section的内容,参数指定了section的名称。运行程序后可以看到如下结果:
注意,section只能在当前view或它的layout中被调用。@rendersection方法没有找到参数指定的section会抛异常,如果不确定section是否存在,则需要指定第二个参数的值为false,如下:
... @rendersection("scripts", false) ...
我们还可以通过 issectiondefined 方法来判断一个section是否被定义或在当前view中是否能调用得到,如:
... @if (issectiondefined("footer")) { @rendersection("footer") } else { <h4>this is the default footer</h4> } ...
partial view
partial view(分部视图)是将部分 razor 和 html 标签放在一个独立的视图文件中,以便在不同的地方重复利用。接下来介绍如何使用 partial view。
我们先来创建一个partial view 。在 /views/shared 目录下新建一个名为 mypartial 的视图文件,勾选“创建为分部视图”,如下:
添加好的 partial view 文件是一个空文件,我们在这个文件中添加如下代码:
<div> this is the message from the partial view. @html.actionlink("this is a link to the index action", "index") </div>
这个 mypartial.cshtml 视图用将创建一个回到首页的连接。当然这里的 @html.actionlink 方法也是一种(html helper)动态加载view内容的方式。
然后在 homecontroller 中添加一个list action方法,如下:
public actionresult list() { return view(); }
继续为此添加一个 list.cshtml 视图,并通过@html.partial方法来调用我们要呈现的分部视图,如下:
@{ viewbag.title = "list"; layout = null; } <h3>this is the /views/home/list.cshtml view</h3> @html.partial("mypartial")
视图引擎将按照规定的顺序先后在 /views/home 和 /views/shared 文件夹下查找 mypartial 视图。
运行程序导航到 /home/list,我们可以看到如下效果:
partial view 和普通和 view 的使用没有什么区别,也可以使用强类型,如我们在 mypartial.cshtml 中通过 @model 指定 model 的类型:
@model ienumerable<string> <div> this is the message from the partial view. @html.actionlink("this is a link to the index action", "index") <ul> @foreach (string str in model) { <li>@str</li> } </ul> </div>
并修改调用 mypartial.cshtml 视图的主视图 list.cshtml 如下:
@{ viewbag.title = "list"; layout = null; } <h3>this is the /views/home/list.cshtml view</h3> @html.partial("mypartial", new[] { "apple", "orange", "pear" })
和上面不同的是,这里我们给 @html.partial 指定了第二个参数,将一个数组传递给了 mypartial.cshtml 的 model 对象。运行效果如下:
child action
child action 和 patial view 类似,也是在应用程序的不同地方可以重复利用相同的子内容。不同的是,它是通过调用 controller 中的 action 方法来呈现子内容的,并且一般包含了业务的处理。任何 action 都可以作为子 action 。接下来介绍如何使用它。
在 homecontroller 中添加一个 action,如下:
[childactiononly] public actionresult time() { return partialview(datetime.now); }
这个 action 通过调用 partialview 方法来返回一个 partial view。childactiononly 特性保证了该 action 只能作为子action被调用(不是必须的)。
接着我们继续为这个action添加一个相应的 time.cshtml 视图,代码如下:
@model datetime <p>the time is: @model.toshorttimestring()</p>
在 list.cshtml 视图中添加如下代码来调用 time action 方法 :... @html.action("time")
运行结果如下:
我们通过 @html.action 方法来调用了 time action 方法来呈现子内容。在这个方法中我们只传了一个action名称参数,mvc将根据当前view所在controller去查找这个action。如果是调用其它 controller 中的 action 方法,则需要在第二个参数中指定 controller 的名称,如下:
... @html.action("time", "mycontroller")
该方法也可以给 action 方法的参数传值,如对于下面带有参数的 action:
... [childactiononly] public actionresult time(datetime time) { return partialview(time); }
我们可以这样使用 @html.action 方法:... @html.action("time", new { time = datetime.now })
以上就是[asp.net mvc 小牛之路]12 的内容。
其它类似信息

推荐信息