我正在开发一个mvc项目,我想在每个页面上显示一个赞助商。
但是我很难将它们展示到每个视图渲染的共享布局页面中。
我在我的Domain服务类中创建了一个函数,我在那里搜索学生的学校,因为学校与一个国家而不是学生有联系。 当我得到那个countryId时,我搜索每个广告的国家,其中countryId等于学校的countryId。在这种情况下,我会寻找该特定广告的赞助商,将它们放入SponsorList,从该SponsorList中选择一个随机赞助商并返回SponsorCompany(因为我将每个sponsorimage重命名为公司名称)。
现在我想将该功能调用到共享布局中,因此每次页面呈现时,都会为该特定学生显示随机赞助图像。但我不知道如何调用该函数,因为共享布局没有控制器类。
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;
}
抱歉,英语不是我的母语。
答案 0 :(得分: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中使用它,即使它本身与之无关一个特定的控制器。
答案 1 :(得分:0)
扩展@SLaks建议;
创建一个标有ChildActionOnlyAttribute
的操作(这可以防止通过常规HTTP请求调用它)。以下是我网站上的一个例子:
[HttpGet]
[ChildActionOnly]
public ActionResult RandomQuote()
{
var model = _services.GetRandomQuote();
return PartialView("_QuoteOfTheMomentWidget", model);
}
通过简单的_Layout
在@Html.Action("randomquote")
中调用此子操作。