it-swarm-ko.tech

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

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

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

102
Łukasz Sowa

뷰에 강력한 형식의 뷰 데이터 클래스가있는 것을 선호한다면이 방법이 효과적 일 수 있습니다. 다른 솔루션은 아마도 올바른 일 것입니다. 그러나 이것은 디자인과 실용성 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 용으로 설계되었습니다.

77
Generic Error

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

  1. 마스터 뷰 데이터는 "일반"뷰 모델과 완전히 분리되어 있습니다. 이것은 상속에 대한 구성이며 변경하기 쉬운 더 느슨하게 연결된 시스템을 만듭니다.
  2. 마스터 뷰 모델은 완전히 별도의 컨트롤러 작업으로 구성됩니다. "정규"액션은 이에 대해 걱정할 필요가 없으며 뷰 데이터 팩토리가 필요하지 않습니다.
  3. 도메인을 뷰 모델에 매핑하기 위해 AutoMapper 와 같은 도구를 사용하는 경우 뷰 모델이 상속되지 않을 때 뷰 모델이 도메인 모델과 더 유사하기 때문에 구성하기가 더 쉽습니다. 마스터 뷰 데이터.
  4. 마스터 데이터에 대한 별도의 조치 방법을 사용하면 페이지의 특정 영역에 출력 캐싱을 쉽게 적용 할 수 있습니다. 일반적으로 마스터보기에는 기본 페이지 컨텐츠보다 덜 자주 변경되는 데이터가 포함됩니다.
59
Todd Menier

[~ # ~] 편집 [~ # ~]

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

원래 답변

Microsoft는 실제로이를 처리하기 위해 "공식적인"방법 에 항목을 게시했습니다. 이를 통해 추론에 대한 설명이 단계별로 제공됩니다.

요컨대, 추상 컨트롤러 클래스를 사용하는 것이 좋지만 직접 참조하십시오.

20
Michael La Voie

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

7
Ian P

나는 약간의 연구를했고이 두 사이트를 발견했다. 아마 그들은 도울 수 있습니다.

ASP.NET MVC 팁 # 31 – 마스터 페이지 및 사용자 정의 컨트롤에 데이터 전달

ASP.NET MVC를 사용하여 마스터 페이지에 데이터 전달

3
David Negron

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

어쨌든 페이지 간에는 항상 공통적 인 모델 속성이있는 경향이 있습니다.

2
Matt Mitchell

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

0
dimarzionist

다른 솔루션에는 우아함이없고 너무 오래 걸립니다. 거의 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 ()이 있습니다.

0
rasx

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

0
mtutty