2013-06-03 3 views
0

저는 mvc 프로젝트에서 작업 중이며 각 페이지에 스폰서 이미지를 표시하려고합니다.뷰에서 정적 함수를 호출하십시오.

하지만 각보기에서 렌더링되는 공유 레이아웃 페이지에 표시하는 데 어려움이 있습니다.

나는 학교가 학생이 아닌 국가에 연결되어 있기 때문에 학생의 학교를 검색하는 도메인 서비스 클래스에 함수를 만들었습니다. 내가 그 나라를 찾았을 때, 나는 각 국가의 국가를 검색하고 그 국가는 학교의 국가와 동일합니다. 이 경우 특정 광고의 후원자를 찾아 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;  
} 

영어가 내 모국어가 아닙니다.

+0

어린이 작업을 고려해보십시오. – SLaks

+0

제 제안은 '정적 메소드'를 잊어 버릴 것입니다. 올바른 MVC 패턴이 아니기 때문입니다. 비즈니스 모델의 논리가 '보기'에 없어야합니다. 'ViewModel'을 생성하고'ViewModel'에 바인드 된 간단한'PartialView'를 리턴합니다. – IamStalker

답변

0

@SLaks 제안시 확장하려면;

ChildActionOnlyAttribute으로 표시된 작업을 만듭니다 (이렇게하면 일반 HTTP 요청을 통해 호출되지 않습니다). 여기 내 웹 사이트에서 예는 다음과 같습니다

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

    return PartialView("_QuoteOfTheMomentWidget", model); 
} 

이 자식 작업은 간단한 @Html.Action("randomquote")를 통해 _Layout에 호출됩니다.

+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-was-not-implement-icontroller 그러나 나는이 영역에서 작업하지 않고 있으며,이 기능은 모든 사람들을 위해 작동해야합니다. – 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 공유 뷰에서 호출합니다. 여기에는 내 탐색 막대 등이 있으며 컨트롤러가 없습니다. 내가 홈택터에 넣으면이 홈페이지는 홈페이지에서만 작동합니다. – Gijs

+0

아니요, 그렇지 않습니다. 필자가 대답했듯이,'RenderAction'은'controller' 매개 변수를 취합니다.이 매개 변수를 사용하면 어떤 컨트롤러 클래스에'MyAction' 작업 메서드가 포함되어 있는지 지정할 수 있습니다. Layout.cshtml을 포함하여 모든 컨트롤러의 PartialViewResults를 모든보기로 렌더링하는 데 사용할 수 있습니다. –

관련 문제