ASP.NET MVC之分部视图和ChildAction(三)

前言

上节我们已经非常清晰并且明确的讲了@Html.ActionLink的作用,这一节我们开始讲讲分部视图以及孩子Action。

话题

在C#中我们知道继承的目的是为了代码的复用,在Web应用程序同样也是如此,同样重复的代码我们需要进行复用。 例如在博客园我们需要渲染每个博客园友的信息。下面我们开始进行演示。我们在创建的项目中的Models文件夹下添加如下一个博客类:

    public class Blog
    {
        public long Id { get; set; }

        public string Name { get; set; }

        public string BlogAddress { get; set; }

        public string Description { get; set; }

    }

紧接着我们添加一个博客控制器,如下:

        public ActionResult Index()
        {
            List<Blog> blogs = new List<Blog>()
            {
                new Blog { Id =1, Name ="xpy0928 1",BlogAddress="http://www.cnblogs.com/CreateMyself/", Description ="出生非贫即贵,你我无能为力"},
                new Blog { Id =2, Name ="xpy0928 2", BlogAddress="http://www.cnblogs.com/CreateMyself/",Description ="后天若不加以努力赶之超之,又能怪谁呢!"},
                new Blog { Id =3, Name ="xpy0928 3",BlogAddress="http://www.cnblogs.com/CreateMyself/", Description ="自己都靠不住不靠谱,又能靠谁呢!" },
                new Blog { Id =4, Name ="xpy0928 4", BlogAddress="http://www.cnblogs.com/CreateMyself/",Description ="靠自己!"}
            };
            return View(blogs);
        }

最后我们在该Action方法对应的视图Index添加如下代码:

@model IEnumerable<ASP.NET_MVC_3.Models.Blog>

<style type="text/css">
    span {
        color: white;
    }
</style>
@foreach (var product in Model)
    {
    <div style="background-color:crimson">
        ID: <span>@product.Id</span>
        Name: <span>@product.Name</span>
        Description: <span>@product.Description</span>
        Price: <span>@product.Price</span>
        <hr style="color:white" />
    </div>
    }

下面我们运行程序看看效果:

 上面我们简单的描述了下获取博客的相关信息,一切都是正常的进行。

那么问题来了,要是每个博客对象有很多属性那该如何呢?要是我们想在所有页面都要获取对象的信息又该如何呢?

难道我们就需要在所有页面都要写出所有的对象的属性吗?No,MVC已经完全给出了解决方案:利用分部视图。接下来我们进入分部视图。

分部视图

在上面的基础上,我们来进行改造,我们将视图Index页面改写成如下:

@model IEnumerable<ASP.NET_MVC_3.Models.Blog>

<style type="text/css">
    span {
        color: white;
    }
</style>

<h2>Blogs</h2>

@foreach (var blog in Model)
{
    @Html.Partial("BlogDetails", blog)

}

在上述我们利用  @Html.Partial 该方法来请求分部视图,同样我们可以利用 Html.RenderPartial 来请求分部视图,但是这二者处理起来有点区别,当我们在利用 @Html.Partial 渲染分部视图时我们这样用:

@foreach (var blog in Model)
{
   @Html.Partial("BlogDetails",blog)

}

但是我们利用 Html.RenderPartial 时,如下:

@foreach (var blog in Model)
{
   Html.RenderPartial("BlogDetails",blog)

}

此时或报错,如下:

也就是说在该句末尾必须添加分号(;)。而@Html.Partial有无分号(;)皆可,这个是需要注意的地方,二者还有其他区别。

区别

@Html.Partial返回字符串,而Html.RenderPartial返回void,我们完全可以保存@Html.Partial在一个变量中或者从一个函数中进行返回,但是在Html.RenderPartial不能这样做,因为其结果在执行期间已经写到了响应流中 ,由于Html.RenderPartial将结果写到了响应流中所以Html.RenderPartial的比@Html.Partial执行更加快且高效。因此建议使用Html.RenderPartial。

我们接着在Views文件夹下的Shared下添加BlogDetails视图,并添加如下代码:

@model  ASP.NET_MVC_3.Models.Blog

<div style="background-color: crimson">
    ID: <span>@Model.Id</span>
    Name: <span>@Model.Name</span>
    BlogAddress: <span>@Model.BlogAddress</span>
    Description: <span>@Model.Description</span>
    <hr style="color: white" />
</div>

下面我们继续来看看结果:

我们利用分部视图复用了代码,如果我们想改变对象或者添加属性我们只需要改变分部视图即可,利用分部视图动态进行渲染。上述我们是利用分部视图进行渲染数据。

那么问题来了,我们上述利用分部视图是直接请求视图,要是我们需要根据博客对象传到后台进行处理过滤数据,我们该如何做呢?请继续往下看。

ChildAction(孩子Action)

在上述中我们需要将遍历的博客对象传到后台进行相应的处理来过滤数据最终跳转到分部视图,此时我们需要用到ChildAction特性,我们首先在博客控制器下再创建一个方法,如下:

        public ActionResult DisplayBlog(Blog blog)
        {
            switch (blog.Id)
            {
                case 1:
                    blog.Name = "Child Action Blog 1";
                    blog.Description = "Child Action Description 1";
                    break;
                case 2:
                    blog.Name = "Child Action Blog 2";
                    blog.Description = "Child Action Description 2";
                    break;
                case 3:
                    blog.Name = "Child Action Blog 3";
                    blog.Description = "Child Action Description 3";
                    break;
                case 4:
                    blog.Name = "Child Action Blog 4";
                    blog.Description = "Child Action Description 4";
                    break;
                default:
                    break;
            }

            return PartialView("BlogDetails", blog);
        }

接下来我们在Index页面需要请求Action方法,如下:

@model IEnumerable<ASP.NET_MVC_3.Models.Blog>

<style type="text/css">
    span {
        color: white;
    }
</style>

<h2>Blogs</h2>

@foreach (var blog in Model)
{
    @Html.Action("Displayblog", blog)
}

此时我们运行程序看看,结果如下:

结果正确,但是我们得注意到上述我们没有用到ChildAction特性,要是有心人直接请求Blog控制器下的DisplayBlog方法呢?我们来看看结果:

没有得到我们预想的结果,因为我们需要通过Index视图传过来的博客对象并对对象作出相应的处理而返回对应的数据,我们直接去请求肯定不会达到我们所预想。由于我们是通过Index视图传到DisplayBlog方法,也就是说该方法只是起到了一个间接的作用也就是作为Index的子方法,所以此时我们在该方法上添加如下一句:

        [ChildActionOnly]
        public ActionResult DisplayBlog(Blog blog)

此时我们照样也得到上述结果,但是当我们直接请求该方法,那么结果该如何呢?我们来看下:

通过[ChildAction]特性修饰后,上述我们是直接请求该DisplayBlog所以会出现如下错误,这样就完全达到了我们的期望,此时若直接请求该方法出现如上错误,我们完全可以捕捉到该异常,进行下异常处理并响应不存在该页面,访问出错即可。

结语 

本节我们讲了分部视图以及ChildAction的用途,同时也比较两种分部视图执行的高效问题,希望对阅读本篇文章的你有点帮助,我们下节再见。

 

时间: 2024-10-30 06:38:00

ASP.NET MVC之分部视图和ChildAction(三)的相关文章

asp net mvc4-asp.net mvc通过分部视图实现jquery中load的效果疑问

问题描述 asp.net mvc通过分部视图实现jquery中load的效果疑问 我想通过asp.net mvc自带的分部视图等功能实现jquery中类似于load的效果: 我有一个完整的页面,通过@html.partialview(分部视图A)渲染了部分内容,然后在分部视图A中采用Ajax.beginForm()提交,在控制器中renturn partialView("分部视图B"),返回值类型为partialViewResult.我以为应当是分部视图A被分部视图B替换了,整个页面其

ASP.NET MVC中的视图生成实例分析_实用技巧

本文实例分析了ASP.NET MVC中的视图生成过程.分享给大家供大家参考.具体如下: 在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据. 从控制器到视图 通常,在 Controller 中,我们定义多个 Action ,每个 Action 的返回类型一般是 ActionResult,在 Action 处理的最后,我们返回对于视图的调用. 复制代码 代码如下: pub

easyui 放在MVC的分部视图中,样式不显示

问题描述 easyui 放在MVC的分部视图中,样式不显示 easyui 放在MVC的分部视图中,css样式不显示 解决方案 迭代器应用: list l = new ArrayList(); l.add("aa"); l.add("bb"); l.add("cc"); for (Iterator iter = l.iterator(); iter.hasNext();) { String str = (String)iter.next(); Sy

spring mvc能否实现类似.net mvc的分部视图

问题描述 spring mvc能否实现类似.net mvc的分部视图 之前用.net做了个小项目,直接在controller renturn partialview蛮好用的, spring mvc能做到类似的东西吗?用div query load是一个解决办法, 但是前端代码写起来比较麻烦

ASP.NET MVC中的视图生成简介

在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据. 从控制器到视图 通常,在 Controller 中,我们定义多个 Action ,每个 Action 的返回类型一般是 ActionResult,在 Action 处理的最后,我们返回对于视图的调用. public ActionResult Index() {    return this.View(); } 默认情

Asp.net mvc 2中使用Ajax的三种方式

在Asp.net MVC中,我们能非常方便的使用Ajax.这篇文章将介绍三种Ajax使用的方式,分别为原始的Ajax调用.Jquery.Ajax Helper.分别采用这三种方式结合asp.net mvc去实现一个史上最简单的留言板. 首先看一下原始的Ajax的调用的 定义CommentController,代码如下: public class CommentController : Controller { private IList<string> _comments = new List

一起谈.NET技术,Asp.net mvc 2中使用Ajax的三种方式

     在Asp.net MVC中,我们能非常方便的使用Ajax.这篇文章将介绍三种Ajax使用的方式,分别为原始的Ajax调用.Jquery.Ajax Helper.分别采用这三种方式结合asp.net mvc去实现一个史上最简单的留言板.     首先看一下原始的Ajax的调用的:      定义CommentController,代码如下: public class CommentController : Controller{private IList<string> _commen

ASP.NET MVC 控制器与视图_实用技巧

一.控制器相关 在Controller类中方法访问级别为public的方法,就是行为(Action).如果不希望Controller类中的方法成为Action(可以在地址栏中被访问),有两种实现方式:将方法的访问级别设置为private在方法上添加特性标记[NonAction] 诸如新增\修改等功能模块,我们往往会创建2个名称相同的Action:一个action用于加载新增\修改页面;另一个action用于处理新增\修改页面提交的表单数据.那么如何区分在何时调用哪个action呢? 我们将加载新

ASP.NET MVC Music Store教程(3):视图和视图模型

转自http://firechun.blog.163.com/blog/static/31804522201102711480936/ 到目前为止,我们仅仅从控制器动作返回字符串,这是一个了解控制器如何工作的好方法,但这并不是你想要的真实的Web应用程序.我们想要一个更好的方法为访问我们站点的浏览器产生HTML,使用模板文件可以更容易地定制发回的HTML内容. 添加视图模板 要使用视图模板,可以修改HomeController的Index方法,让它返回ActionResult,就象下面这样返回V