정적 인 정보를 중앙 집중화하려고합니다. 사용자 이름 또는 로고 이미지 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를 건너 뛸 수있는 좋은 대안이나 나쁜/나쁜 코딩 방법이 있습니까?
세 번째 생각은 현재 모델 내에서 특정 필드 (예 : 로고)를 찾아서 설정하는 액션 필터 또는 기본 클래스에 코드를 추가하고 설정하는 것입니다. 그러나 이것이 역동적 인 방식으로 쉽게 달성된다면 나는 확신하지 못합니다.
로고를 처음으로 출력하는 곳이 많은 이유를 재검토하고 싶을 수 있습니다. Layouts 및 RenderAction을 사용하여 해당 책임을 단일 컨트롤러 /보기로 가져올 수 있습니다. – StriplingWarrior
모든보기에 단일 데이터 필드가 펼쳐져있는 것은 아니지만 때로는 사이트 전체에서 사용되는 몇 가지 필드가 있습니다. 이 중 대다수는 레이아웃 페이지와 여러 뷰가 참조하는 일부 부분 뷰 내에 있습니다. 어느 쪽이든 좋은 지적입니다. – jrale