1

以希望在您的 ASP.NET MVC 网站的每个页面上都有一个“最新新闻项目”侧边栏为例。我有一个 NewsItemController,它适用于专注于 NewsItems 的页面。让新闻侧边栏出现在主页的 HomeController 上怎么样?或者任何其他控制器?

我的第一直觉是将选择前 5 个 NewsItems 的逻辑放在用户控件中,然后在母版页中调用该控件。这样,每个页面都会获得一个新闻侧边栏,而不必用 NewsItem 逻辑污染任何其他控制器。这意味着将逻辑放入我所理解的表示层中,该表示层通常会放入控制器中。

我可以想到大约六种不同的方法来处理它,但就关注点分离和其他相关流行语而言,它们似乎都不“正确”。

4

3 回答 3

1

我认为您应该考虑将其放在您的母版页中。您的控制器可以收集数据(当然是异步的),将其存储在视图的一个不错的 ViewModel 属性中(或在 TempData 中),然后您可以在母版页中调用 RenderPartial() 来呈现数据。

让一切“分开”

于 2010-01-11T03:19:46.587 回答
1

http://eduncan911.com/blog/html-renderaction-for-asp-net-mvc-1-0.aspx

这似乎解决了这个问题 - 即使使用侧边栏的实例 - 但默认情况下使用 MVC 1 不包含的功能。

http://blogs.intesoft.net/post/2009/02/renderaction-versus-renderpartial-aspnet-mvc.aspx

这也表明答案在于 RenderAction。

对于其他感兴趣的人,这就是我最终的做法。请注意,您需要 RenderAction 的 MVC Futures 程序集。

基本上你的控制器中有这样的东西:

public class PostController
{

//...

   public ActionResult SidebarBox()
   {
      // I use a repository pattern to get records
      // Just replace it with whatever you use
      return View(repoArticles.GetAllArticles().Take(5).ToList());
   }

//...

}

然后为 SidebarBox 创建一个局部视图,其中包含您想要显示的内容,并在您的母版页(或您想要显示它的任何地方)中使用:

<% Html.RenderAction<PostController>(c => c.SidebarBox()); %> 

毕竟没那么难。

于 2010-01-11T03:28:03.910 回答
1
  1. 您可以创建一个用户控件 (.ascx),然后调用 RenderPartial()。
  2. 在控制器中设计一个以 JsonResult 作为返回类型的方法。将它与 jQuery 一起使用。
  3. 按照其他地方的建议使用 RenderAction() 。

带有 ASP.NET MVC 的新闻部分

于 2010-01-11T10:11:22.517 回答