有没有办法为我的_Layout创建特殊控制器?

时间:2013-09-01 18:08:48

标签: c# asp.net-mvc-4

我正在开发一个网站,在_MainPage文件夹中有一个名为View\Shared的视图,其他视图用于我网站的基本布局,因此我在此视图中有一个部分用于填充数据库中的数据事实上这部分是该网站的最新消息,我应该在本节中显示最新消息,我应该以简单的方式制作一个名为latestNews的部分:

<ul class="news-list">
    @RenderSection("latestNews",required:false)
</ul>

在每个视图中,我应该用剃刀填写这部分数据来自相关控制器:

@foreach (var item in Model.News)
{
    <div>
        <p>@Html.Raw(item.Body)<br /><a href="#">ادامه مطلب</a></p>
    </div>
}

事实上,我在页面页脚的每个视图中都有最新消息。

现在我的问题是:如何为每个视图中没有执行这些例程的View(_MainPage)定义自定义控制器。有没有通用的方法来实现它?

2 个答案:

答案 0 :(得分:1)

您可以使用Html.RenderAction来指定控制器和操作,而不是部分。该操作应返回部分视图,然后将其集成到调用站点中。

答案 1 :(得分:1)

控制器类中的任何公共方法都是一种操作方法。可以通过Web浏览器中的URL或应用程序中的视图页面调用控制器类中的每个操作方法。

您的方案是需要在应用程序的几个页面上显示的一些动态信息(数据)。通常我们最终会将这些数据添加到通过操作方法传递给视图的模型中。我们在多个模型中复制相同的数据,我们制动DRY(不要重复自己)原则。

为了处理这种情况,ASP.NET MVC提供了子操作方法。任何操作方法都可以是子操作方法,但子操作是从视图中调用的操作方法,您不能通过用户请求(URL)调用子操作方法。

我们可以使用[ChildActionOnly]属性注释一个用于创建子操作的操作方法。通常我们使用具有部分视图的子动作方法,但不是每次都使用。

[ChildActionOnly]表示一个属性,用于指示应仅将动作方法作为子动作调用。

[ChildActionOnly]
public ActionResult GetNews(string category)
{
    var newsProvider = new NewsProvider();
    var news = newsProvider.GetNews(category);
    return View(news);
}

可以使用Html.RenderAction()Html.Action()方法在应用程序的任何视图中调用上面的子操作方法。

@Html.Action("GetNews", "Home", new { category = "Sports"})

(或)

@{ Html.RenderAction("GetNews", "Home", new { category = "finance"}); }