MVC 규칙을 위반하지 않고 데이터를 마스터 페이지 (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을 . 이것은 널리 사용되는 뷰 모델 상속 접근 방식에 비해 몇 가지 뚜렷한 이점이 있습니다.
편집하다
일반 오류 가 아래에 더 나은 답변을 제공했습니다. 읽어주세요!
원래 답변
마이크로 소프트는 실제로 이것을 처리하기 위해 "공식적인"방식으로 항목을 게시했습니다 . 이것은 추론에 대한 설명과 함께 단계별 안내를 제공합니다.
간단히 말해서 추상 컨트롤러 클래스를 사용하는 것이 좋지만 직접 확인하십시오.
몇 가지 조사를했고이 두 사이트를 발견했습니다. 도움이 될 수도 있습니다.
Request.Params 객체는 변경 가능합니다. 요청 처리주기의 일부로 스칼라 값을 추가하는 것은 매우 쉽습니다. 보기의 관점에서 해당 정보는 QueryString 또는 FORM POST에 제공되었을 수 있습니다. hth
또 다른 좋은 방법은 일부 인터페이스의 ParentView와 같은 일부 속성을 사용하여 뷰에 대한 인터페이스를 만드는 것이므로 페이지 (부모 컨트롤)에 대한 참조가 필요한 컨트롤과 액세스해야하는 마스터 뷰 모두에 사용할 수 있습니다. 견해.
다른 솔루션은 우아함이 부족하고 너무 오래 걸립니다. 거의 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 ()이 있습니다.