【问题标题】:Partial Views in MVCMVC 中的局部视图
【发布时间】:2010-11-19 12:56:20
【问题描述】:

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

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

场景:

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

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

我还将这个存档树用户控件输出到我的主博客页面的一侧 - 博客页面仅呈现单个博客文章的详细信息。

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

MVC:

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

我想在我的照片博客页面上包含一个局部视图(存档树,它将呈现多条记录),它将循环显示多条照片记录 (List<Photo>)。

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

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

我期待有一个简单的解决方案来解决这个问题,我目前还不知道对 MVC 如此陌生。

【问题讨论】:

    标签: asp.net-mvc partial-views


    【解决方案1】:

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

    你可以用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)

    【讨论】:

    • 谢谢大卫。这已经很好地和简单地排序了。很方便知道。
    【解决方案2】:

    您可以通过将局部视图的模型设为List&lt;Photo&gt;(甚至更好,IEnumerable&lt;Photo&gt;)来解决此问题。当您调用RenderPartial 时,您可以使用(string, object) 重载来指定要传递给视图以使其呈现的对象:

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

    【讨论】:

    • 谢谢。我首先看到了大卫的建议,并且已经对其进行了排序,但是我相信这也可能会派上用场。非常感谢您提供的信息。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      在Index.cshtml中

           @Html.Partial("_Index");
      

      在_index.cshtml中

         <table>
           whatever 
         </table
      

      【讨论】:

      • 你能解释一下你的答案吗
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多