[c#] ASP.NET MVC의 마스터 페이지에 데이터 전달
MVC 규칙을 위반하지 않고 데이터를 마스터 페이지 (ASP.NET MVC 사용)에 전달하는 방법은 무엇입니까?
개인적으로 모든 뷰에 전달되는 추상 컨트롤러 (기본 컨트롤러) 또는 기본 클래스를 코딩하는 것을 선호합니다.
답변
보기에 강력한 형식의보기 데이터 클래스를 선호하는 경우이 방법이 적합 할 수 있습니다. 다른 솔루션이 아마도 더 정확할 수 있지만 이것은 디자인과 실용성 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 용으로 설계되었습니다.
답변
나는 파셜에 마스터 뷰의 데이터 기반 조각을 깨고 사용하여 렌더링 선호 Html.RenderAction을 . 이것은 널리 사용되는 뷰 모델 상속 접근 방식에 비해 몇 가지 뚜렷한 이점이 있습니다.
- 마스터 뷰 데이터는 “일반”뷰 모델에서 완전히 분리됩니다. 이것은 상속에 대한 구성이며 변경하기 쉬운보다 느슨하게 결합 된 시스템이됩니다.
- 마스터 뷰 모델은 완전히 별도의 컨트롤러 동작으로 구성됩니다. “일반적인”액션은 이것에 대해 걱정할 필요가 없으며, 내 취향에 너무 복잡해 보이는 뷰 데이터 팩토리가 필요하지 않습니다.
- AutoMapper 와 같은 도구를 사용 하여 도메인을 뷰 모델에 매핑하는 경우 뷰 모델이 마스터 뷰 데이터를 상속하지 않을 때 도메인 모델과 더 비슷해 지므로 구성하기가 더 쉽습니다.
- 마스터 데이터에 대한 별도의 작업 방법을 사용하면 페이지의 특정 영역에 출력 캐싱을 쉽게 적용 할 수 있습니다. 일반적으로 마스터보기에는 기본 페이지 콘텐츠보다 자주 변경되는 데이터가 포함됩니다.
답변
편집하다
일반 오류 가 아래에 더 나은 답변을 제공했습니다. 읽어주세요!
원래 답변
마이크로 소프트는 실제로 이것을 처리하기 위해 “공식적인”방식으로 항목을 게시했습니다 . 이것은 추론에 대한 설명과 함께 단계별 안내를 제공합니다.
간단히 말해서 추상 컨트롤러 클래스를 사용하는 것이 좋지만 직접 확인하십시오.
답변
추상 컨트롤러는 좋은 생각이며 더 나은 방법을 찾지 못했습니다. 다른 사람들이 한 일도보고 싶습니다.
답변
답변
뷰에 전달하는 모든 모델 객체에 대한 공통 부모가 매우 유용하다는 것을 알았습니다.
어쨌든 페이지 사이에는 항상 몇 가지 공통 모델 속성이있는 경향이 있습니다.
답변
Request.Params 객체는 변경 가능합니다. 요청 처리주기의 일부로 스칼라 값을 추가하는 것은 매우 쉽습니다. 보기의 관점에서 해당 정보는 QueryString 또는 FORM POST에 제공되었을 수 있습니다. hth