2013-06-03 2 views
0

Я работаю над проектом mvc и хочу отображать спонсорство на каждой странице.Call static function in view mvc

Но у меня возникли трудности с отображением их на общей странице макета, которая отображается с каждым видом.

Я создал функцию в моем классе обслуживания домена, где я искал школу ученика, потому что школа связана со страной, а не с учеником. Когда я получил эту страну, я просматриваю страны каждого объявления, где countryId соответствует стране countryId. Когда это так, я ищу спонсора этого конкретного объявления, помещаю его в список спонсоров, выбираю случайного спонсора из этого списка спонсоров и возвращаю спонсорскую компанию (потому что я переименовал каждое спонсорское оформление в название компании).

Теперь я хочу вызвать эту функцию в общий макет, поэтому каждый раз, когда страницы отображаются, для этого конкретного ученика отображается случайное спонсорское изображение. Но я не знаю, как назвать эту функцию, потому что общий макет не имеет класса контроллера.

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

Рассмотрите возможность создания детского мероприятия. – SLaks

+0

Мое предложение было бы забыть о 'static method', потому что это не правильный шаблон' 'MVC '', логика бизнес-модели не должна находиться в' View'. Создайте 'ViewModel', затем верните простой' PartialView', привязанный к этому 'ViewModel'. – IamStalker

ответ

0

Расширить предложение @SLaks;

Создайте действие, которое помечено ChildActionOnlyAttribute (это предотвращает его вызов через обычный HTTP-запрос). Вот пример с моего сайта:

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

    return PartialView("_QuoteOfTheMomentWidget", model); 
} 

Этот ребенок действие вызывается в _Layout с помощью простого @Html.Action("randomquote").

+0

Но в каком контроллере вы помещаете код? Поскольку _Layout.cshtml не имеет контроллера. – Gijs

+0

@Gijs Любой контроллер работает. Например, тот, который я опубликовал, предполагает, что действие определено в Домашнем контроллере, и что '_QuoteOfTheMoment.cshtml' вид существует в папке' home' или 'shared'. Если это было, скажем, 'WidgetsController', вызов настраивается на' @ Html.Action («randomquote», «widgets») '. –

+0

Я реализую ваше решение, но получаю ошибку '{«Контроллер для пути'/'не найден или не реализует IController."}' Я думал, что нашел решение здесь: http://stackoverflow.com/questions/14011026/the-controller-for-path-was-not-found-or-do-not-implement-icontroller Но я не работаю с этими областями, это funtion должно работать для всех. – Gijs

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, даже если он сам по себе не связан с конкретным контроллером.

+0

Я не вызываю метод в представлении homecontroller, но в общем представлении _layout.cshtm. Это содержит мою панель навигации и т. Д. И не имеет контроллера. Если я поместил его в homecontroller, это будет работать только на главной странице. – Gijs

+0

Нет, не будет. Как я описал в своем ответе, «RenderAction» принимает параметр «controller», который позволяет указать, какой класс контроллера содержит метод действия «MyAction». Вы можете использовать его для рендеринга PartialViewResults с любого контроллера в любое представление, в том числе из Layout.cshtml. –