0

我正在开发一个网站,该网站有一个_MainPageView\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>
}

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

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

4

2 回答 2

1

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

于 2013-09-01T18:12:33.487 回答
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()可以使用or方法在应用程序中的任何视图内调用上述子操作Html.Action()方法。

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

(或者)

@{ Html.RenderAction("GetNews", "Home", new { category = "finance"}); }
于 2013-09-01T18:25:29.170 回答