MVC中的部分视图

时间:2010-11-19 12:56:21

标签: asp.net-mvc partial-views

我是MVC的新手,刚刚遇到了我需要一些帮助的场景。

我将简要概述一下我的场景,好像它是一个我更熟悉的Web窗体应用程序。

情景:

我有一个主页,其中列出了最近的10篇博文,以及“存档树”(按时间顺序列出年份/月份,以及这些年/月内每个博客条目的链接)。 / p>

我将此“存档树”创建为用户控件,并在我的主页上输出该用户控件。

我还将此存档树用户控件输出到我的主要博客页面的一侧 - 博客页面仅显示一篇博文的详细信息。

我还想在我的Web应用程序中的几个其他页面上重用此存档树控件。

MVC:

我有一个'PhotoController'控制器,它有一个ActionResult方法,负责获取所选照片博客帖子(id)的详细信息。

我想在我的照片博客页面上包含一个部分视图(存档树,它将呈现多个记录),它将遍历多张照片记录(List<Photo>)。

我可以创建一个视图模型,它包含一个'Photo'属性(用于渲染单个照片博客记录详细信息)和一个名为'PhotoArchive'的第二个属性,它是List<Photo>

我对这种方法的关注是,当我在整个网站的某些其他部分重新使用这个“存档树”部分视图时,我不一定想要通过相同的视图模型(包含'Photo'和'PhotoArchive'对象)到父视图。例如,我的主页不需要通过“照片”对象传递到呈现主页的视图,但我仍然想在我的主页上的其余HTML中输出我的“存档树”部分视图。

我期待有一个简单的解决方案,我现在还不知道对MVC这么新。

4 个答案:

答案 0 :(得分:2)

有几种方法可以实现这一目标:

您可以使用Html.RenderAction() http://www.asp.net/mvc/videos/aspnet-mvc-2-render-action

或者您可以使用不同的视图模型

class HomePageViewModel {
  IEnumerable<Blog> PhotoArchive { get; set; }
}
class BlogPageViewModel {
  IEnumerable<Blog> PhotoArchive { get; set; }
  Blog Photo { get; set; }
}

并在调用Html.RenderPartial("view", model.PhotoArchive)

时传递PhotoArchive属性

或者您可以使用和界面

interface IMyViewPage {
  IEnumerable<Blog> PhotoArchive { get; set; }
}
class MyViewModel : IMyViewPage{
  //...
  Blog PhotoBlog { get; set; }
}

Model.RenderPartial("view", model)

答案 1 :(得分:2)

您可以通过制作部分视图的模型List<Photo>(甚至更好,IEnumerable<Photo>)来解决此问题。当您致电RenderPartial时,您可以使用(string, object)重载来指定要传递给视图的对象以供呈现:

<% Html.RenderPartial("PartialView.ascx", ViewData.Model.PhotoArchive) %>

答案 2 :(得分:0)

定义一个界面,例如IArchiveTree,描述树视图模型的结构,然后使您希望显示为树的所有模型对象实现该接口。

答案 3 :(得分:0)

在Index.cshtml中

     @Html.Partial("_Index");

在_index.cshtml

   <table>
     whatever 
   </table