2014-05-08 2 views
0

정적 인 정보를 중앙 집중화하려고합니다. 사용자 이름 또는 로고 이미지 URL 원래 정리하고있는 코드는이 정보를 필요로하는 각 컨트롤러 동작에서이 정보를 찾아 강력한 형식의 모델 내에서 설정합니다. 이로 인해 응용 프로그램 전체에서 반복되는 동일 코드의 수많은 블록 (작성자에 따라 약간 다름)이 발생했습니다.ViewBag를 사용하여 수많은 뷰에서 정적 속성을 직접 참조하는 것일까?

이 정보를 빌드하는 정적 속성을 만들었습니다.

public static class SampleInfo 
{ 
    public static string LogoUrl 
    { 
     get { 
       string logoUrl = "would-do-something-to-store/look-up-image-here"; 
       return logoUrl; 
      } 
    } 
} 

이제 SampleInfo.LogoUrl을 참조하고 매번 개별적으로 조회하지 않고 URL을 얻을 수 있습니다. 그러나 현재이 필드는 모델 내에서 여전히 뷰로 전달되므로 매번 Model.LogoUrl = SampleInfo.LogoUrl을 입력해야합니다.

보기의 <img src="@Model.Logo" /><img src="@ViewBag.Logo" />으로 바꾸고 모든 컨트롤러가 사용하는 기본 컨트롤러 내에 ViewBag.Logo = SampleInfo.LogoUrl;을 설정하는 것이 좋습니다. ViewBag를 사용하여 대부분의 사람들이 눈살을 찌푸린 것처럼 보이지만 이것은 한 곳에서만 설정되고보기가 @ViewBag.Logo을 참조하면 추가 컨트롤러없이 자동으로 기본 컨트롤러에서 가져올 수 있으므로 매우 좋은 옵션처럼 보입니다. 코딩. 특정 뷰와 관련된 모든 데이터는 여전히 강력한 형식의 뷰를 통해 전달되지만 로고는 모델에서 제거되어 ViewBag에 배치됩니다.

동일한 생각으로 이미지를 <img src="@SampleInfo.LogoUrl" />으로 변경하고 ViewBag를 완전히 건너 뛰고 정적 속성을 직접 참조 할 수 있습니다.

정적 속성을 직접 참조하고 ViewBag를 건너 뛸 수있는 좋은 대안이나 나쁜/나쁜 코딩 방법이 있습니까?

세 번째 생각은 현재 모델 내에서 특정 필드 (예 : 로고)를 찾아서 설정하는 액션 필터 또는 기본 클래스에 코드를 추가하고 설정하는 것입니다. 그러나 이것이 역동적 인 방식으로 쉽게 달성된다면 나는 확신하지 못합니다.

+1

로고를 처음으로 출력하는 곳이 많은 이유를 재검토하고 싶을 수 있습니다. Layouts 및 RenderAction을 사용하여 해당 책임을 단일 컨트롤러 /보기로 가져올 수 있습니다. – StriplingWarrior

+0

모든보기에 단일 데이터 필드가 펼쳐져있는 것은 아니지만 때로는 사이트 전체에서 사용되는 몇 가지 필드가 있습니다. 이 중 대다수는 레이아웃 페이지와 여러 뷰가 참조하는 일부 부분 뷰 내에 있습니다. 어느 쪽이든 좋은 지적입니다. – jrale

답변

0

나는 내가 직접 뷰 내에서이 변수를 참조에 문제가 표시되지 않는 <img src="@SampleInfo.LogoUrl" />

귀하의 의견은 이미 당신의 웹 사이트 어셈블리에 연결되어 형식을 사용하는 것이 좋습니다.

+0

고마워요, 이것은 내가 기울고있는 것입니다. 특정 정보를 중앙 집중식으로 유지하는 가장 깨끗한 방법 인 것처럼 보이고 ViewBag 중간 계층을 도입 할 필요가 없습니다. – jrale

+0

정적 변수를 다른 상수와 함께 네임 스페이스에 넣을 수 있도록 뷰 디렉터리의 web.config에 네임 스페이스를 추가하기까지했습니다 (각 뷰에 using 문을 추가하는 것과 같습니다). 자세한 내용은 http://stackoverflow.com/questions/3239006/how-to-import-a-namespace-in-razor-view-page에서 2 차 답변을 참조하십시오. – Grax