ASP.NET MVC의 마스터 페이지에 데이터 전달


102

MVC 규칙을 위반하지 않고 데이터를 마스터 페이지 (ASP.NET MVC 사용)에 전달하는 방법은 무엇입니까?

개인적으로 모든 뷰에 전달되는 추상 컨트롤러 (기본 컨트롤러) 또는 기본 클래스를 코딩하는 것을 선호합니다.


1
나는 이것을 어떻게 관리했는지에 대한 가이드를 썼습니다 : britishdeveloper.co.uk/2010/06/… 도움 이 되어야합니다
BritishDeveloper 2011-06-21

답변:


77

보기에 강력한 형식의보기 데이터 클래스를 선호하는 경우이 방법이 적합 할 수 있습니다. 다른 솔루션이 아마도 더 정확할 수 있지만 이것은 디자인과 실용성 IMHO 사이의 좋은 균형입니다.

마스터 페이지는 관련 정보 만 포함하는 강력한 형식의 뷰 데이터 클래스를 사용합니다.

public class MasterViewData
{
    public ICollection<string> Navigation { get; set; }
}

해당 마스터 페이지를 사용하는 각보기는 해당 정보를 포함하고 마스터 페이지보기 데이터에서 파생 된 강력한 형식의보기 데이터 클래스를 사용합니다.

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
}

개별 컨트롤러가 마스터 페이지 데이터를 모으는 것에 대해 아무것도 알기를 원하지 않기 때문에 해당 로직을 각 컨트롤러에 전달되는 팩토리로 캡슐화합니다.

public interface IViewDataFactory
{
    T Create<T>()
        where T : MasterViewData, new()
}

public class ProductController : Controller
{
    public ProductController(IViewDataFactory viewDataFactory)
    ...

    public ActionResult Index()
    {
        var viewData = viewDataFactory.Create<ProductViewData>();

        viewData.Name = "My product";
        viewData.Price = 9.95;

        return View("Index", viewData);
    }
}

상속은 마스터와 일치하여 관계를 잘 보지만 부분 / 사용자 컨트롤을 렌더링 할 때보기 데이터를 페이지보기 데이터로 구성합니다. 예 :

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
    public SubViewData SubViewData { get; set; }
}

<% Html.RenderPartial("Sub", Model.SubViewData); %>

이것은 예제 코드 일 뿐이며 그대로 컴파일하기위한 것이 아닙니다. ASP.Net MVC 1.0 용으로 설계되었습니다.


4
이것은 Scott Gutherie가 권장하는 방법이므로 동의해야합니다.
Simon Fox

@Simon Fox-scottgu의 추천 링크가 있습니까? 찾을 수 없습니다.
orip 2009


죄송합니다. 이것의 일부를 이해하는 데 약간의 어려움이 있습니다. 컨트롤러의 생성자는 IViewDataFactory의 인스턴스에 전달되지만 시스템은 매개 변수없는 생성자를 예상합니다. 또한 인터페이스에 대한 C # 구문 (특히 "MasterViewData, new ()")에 익숙하지 않습니다. 누군가가 그것을 설명하거나 좋은 자료를 알려줄 수 있습니까? 감사.
Jason

5
저는 강력한 형식의 모델을 사용하는 것을 좋아하지만 마스터 데이터를 다른 모든 모델 및 작업과 결합하는 것을 좋아하지는 않습니다. 이 스레드에 조금 늦게 뛰어 들었지만 더 느슨하게 유지하는 마스터 데이터에 대한 접근 방식을 게시했습니다.
Todd Menier

59

나는 파셜에 마스터 뷰의 데이터 기반 조각을 깨고 사용하여 렌더링 선호 Html.RenderAction을 . 이것은 널리 사용되는 뷰 모델 상속 접근 방식에 비해 몇 가지 뚜렷한 이점이 있습니다.

  1. 마스터 뷰 데이터는 "일반"뷰 모델에서 완전히 분리됩니다. 이것은 상속에 대한 구성이며 변경하기 쉬운보다 느슨하게 결합 된 시스템이됩니다.
  2. 마스터 뷰 모델은 완전히 별도의 컨트롤러 동작으로 구성됩니다. "일반적인"액션은 이것에 대해 걱정할 필요가 없으며, 내 취향에 너무 복잡해 보이는 뷰 데이터 팩토리가 필요하지 않습니다.
  3. AutoMapper 와 같은 도구를 사용 하여 도메인을 뷰 모델에 매핑하는 경우 뷰 모델이 마스터 뷰 데이터를 상속하지 않을 때 도메인 모델과 더 비슷해 지므로 구성하기가 더 쉽습니다.
  4. 마스터 데이터에 대한 별도의 작업 방법을 사용하면 페이지의 특정 영역에 출력 캐싱을 쉽게 적용 할 수 있습니다. 일반적으로 마스터보기에는 기본 페이지 콘텐츠보다 자주 변경되는 데이터가 포함됩니다.

3
+1. 또 다른 장점은 현재 런타임 상태에 따라 동일한보기에서 다른 마스터 페이지를 사용할 수 있다는 것입니다.
StriplingWarrior

1
나는이 대답을 매우 좋아합니다. 설명 된 다른 접근 방식은 약간 복잡해 보입니다.
Paddy

2
이것은 제 생각에 가장 우아한 해결책입니다.
autonomatt 2011 년

1
이 솔루션은 나에게도 가장 잘 보입니다. 정말 감사합니다!
JimDaniel 2011 년

1
이것은 좋은 방법이지만 여전히 "부분 작업"에 대한 경로를 지정해야합니다. 이 응답을 참조하십시오 stackoverflow.com/a/3553617/56621
알렉스

20

편집하다

일반 오류 가 아래에 더 나은 답변을 제공했습니다. 읽어주세요!

원래 답변

마이크로 소프트는 실제로 이것을 처리하기 위해 "공식적인"방식으로 항목을 게시했습니다 . 이것은 추론에 대한 설명과 함께 단계별 안내를 제공합니다.

간단히 말해서 추상 컨트롤러 클래스를 사용하는 것이 좋지만 직접 확인하십시오.


감사합니다! 그 예는 정확히 내가하고있는 일입니다. 데이터베이스에서 오는 모든 페이지의 카테고리입니다.
Martin

MVC의 저자 중 한 명인 Scott Gutherie는 아래 @Generic Error에서 제공하는 솔루션을 권장합니다.
Simon Fox

1
귀하의 답변이 공식적으로 옳고 OP에서 답변으로 수락 된 경우에도 우수 답변으로 안내하는 +1.
IsmailS 2011 년

귀하의 답변이 공식적으로 옳고 OP에서 답변으로 수락 된 경우에도 우수 답변으로 안내하는 +1.
Dave Jellison

실제로 Todd Menier 's가 현재 이에 대한 최상의 답변입니다.
andreialecu 2011 년

7

추상 컨트롤러는 좋은 생각이며 더 나은 방법을 찾지 못했습니다. 다른 사람들이 한 일도보고 싶습니다.



2

뷰에 전달하는 모든 모델 객체에 대한 공통 부모가 매우 유용하다는 것을 알았습니다.

어쨌든 페이지 사이에는 항상 몇 가지 공통 모델 속성이있는 경향이 있습니다.


0

Request.Params 객체는 변경 가능합니다. 요청 처리주기의 일부로 스칼라 값을 추가하는 것은 매우 쉽습니다. 보기의 관점에서 해당 정보는 QueryString 또는 FORM POST에 제공되었을 수 있습니다. hth


0

또 다른 좋은 방법은 일부 인터페이스의 ParentView와 같은 일부 속성을 사용하여 뷰에 대한 인터페이스를 만드는 것이므로 페이지 (부모 컨트롤)에 대한 참조가 필요한 컨트롤과 액세스해야하는 마스터 뷰 모두에 사용할 수 있습니다. 견해.


0

다른 솔루션은 우아함이 부족하고 너무 오래 걸립니다. 거의 1 년 후 이렇게 슬프고 빈곤 한 일을 한 것에 대해 사과드립니다.

<script runat="server" type="text/C#">
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        MasterModel = SiteMasterViewData.Get(this.Context);
    }

    protected SiteMasterViewData MasterModel;
</script>

그래서 분명히 SiteMasterViewData를 반환하는 SiteMasterViewData 에이 정적 메서드 Get ()이 있습니다.


많은 사람들에게 이것은 약간 엉망이거나 '불분명 한'것처럼 보일 수 있지만 작업을 빨리 완료합니다
argh

으. Html.RenderAction ()을 사용했다면 코드를 유지하기가 훨씬 더 어려워 보입니다.
Dan Esparza
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.