MVC 中的部分视图

5
我是全新接触MVC的,现在遇到了一个问题需要帮助。
假设这是一个Web Forms应用程序,我会简单地概述一下我的情况。
场景:
我有一个主页,列出了最近的10篇博客文章,以及一个“存档树”(按时间顺序列出年份/月份,并链接到每个年份/月份中的博客文章)。
我创建了这个“存档树”作为用户控件,并在我的主页上输出该用户控件。
我还在我的主要博客页面下输出此存档树用户控件 - 博客页面呈现单个博客文章的详细信息。
我还想在Web应用程序的其他几个页面上重复使用此存档树控件。
MVC:
我有一个“PhotoController”控制器,它有一个ActionResult方法负责获取所选照片博客文章(id)的详细信息。
我想在我的照片博客页面上包含一个部分视图(存档树,将呈现多个记录),该视图将循环遍历多个照片记录(List < Photo >)。
我可以创建一个视图模型,其中包含一个“照片”属性(用于呈现单个照片博客记录详细信息)和第二个属性称为“PhotoArchive”,它是一个List < Photo >。
然而,我担心这种方法的问题是,当我在网站的其他部分重复使用此“存档树”部分视图时,我不一定想将相同的视图模型(包含“照片”和“PhotoArchive”对象)传递给父视图。例如,我的主页将不需要将“照片”对象传递给呈现主页的视图,但我仍然希望在我的主页上输出“存档树”部分视图。
我希望有一个简单的解决方案,因为我对MVC还很陌生。
4个回答

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; }
}

and Model.RenderPartial("view", model)


谢谢David。这解决得很好,而且很简单。非常有用的知识。 - marcusstarnes

2
您可以通过使您的部分视图的模型变为List<Photo>(或者更好的是IEnumerable<Photo>)来解决此问题。当您调用RenderPartial时,您可以使用(string, object)重载函数来指定要传递给视图以进行呈现的对象:
<% Html.RenderPartial("PartialView.ascx", ViewData.Model.PhotoArchive) %>

谢谢。我先看到了David的建议,问题已经解决了,但我相信这个信息以后也会很有用。非常感谢您的帮助。 - marcusstarnes

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

0
在Index.cshtml文件中
     @Html.Partial("_Index");

在 _index.cshtml 文件中
   <table>
     whatever 
   </table

请问您能否详细解释一下您的答案? - Milad Faridnia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接