0

我正在做一个 mvc 项目,我想在每个页面上显示一个赞助商图像。

但是我很难将它们显示到每个视图都呈现的共享布局页面中。

我在我的域服务类中创建了一个函数,我在其中搜索学生的学校,因为学校链接到一个国家,而不是学生。当我得到那个 countryId 时,我会搜索每个广告的 countryId 等于学校的 countryId 的国家。在这种情况下,我查找该特定广告的赞助商,将它们放入 SponsorList,从该 SponsorList 中选择一个随机赞助商并返回 SponsorCompany(因为我将每个赞助商图像重命名为公司名称)。

现在我想将该函数调用到共享布局中,因此每次页面呈现时,都会为该特定学生显示一个随机赞助商图像。但我不知道如何调用该函数,因为共享布局没有控制器类。

    public String advertsForCountry()
{
    String studentSchool = finder.getLoggedStudent().SchoolId;
    int studentCountry = db.Schools.Find(studentSchool).CountryId;

    List<Sponsor> sponsorsForStudent = new List<Sponsor>();
    List<Advert> adverts = db.Adverts.ToList();
    foreach(Advert adv in adverts)
    {
        foreach(Country cntry in adv.Countries)
        {
            if(cntry.CountryId == studentCountry)
            {
                sponsorsForStudent.Add(adv.Sponsor);
            }
        }
    }
    Random random = new Random();
    int randomSP = random.Next(0, sponsorsForStudent.Count()-1);
    string sponsorAdvert = sponsorsForStudent.ElementAt(randomSP).SponsorCompany;
    return sponsorAdvert;       
}

抱歉,英语不是我的母语。

4

2 回答 2

0

创建一个返回部分视图的控制器操作。

public PartialViewResult SponsoredAdvert()
{
    var model = new SponsoredAdverModel();
    model.AdvertText = _domainService.advertsForCountry();
    return PartialView("myView", model);
}

将该方法放在合适的控制器中(HomeController考虑到这是为您的 Layout.cshtml 设计的,这很有意义)并RenderAction在您的视图中使用:

@Html.RenderAction("MyAction", "MyController")

如您所见,RenderAction允许您指定控制器,这意味着您可以在 Layout.cshtml 中使用它,即使它本身与特定控制器无关。

于 2013-06-03T20:28:49.877 回答
0

扩展@SLaks 的建议;

创建一个标有 a 的操作ChildActionOnlyAttribute(这可以防止通过常规 HTTP 请求调用它)。这是我网站上的一个例子:

[HttpGet]
[ChildActionOnly]
public ActionResult RandomQuote()
{
    var model = _services.GetRandomQuote();

    return PartialView("_QuoteOfTheMomentWidget", model);
}

这个子动作_Layout通过一个简单的@Html.Action("randomquote").

于 2013-06-03T20:32:39.413 回答