여기에는 다양한 방법이 있습니다. 컨트롤러에서 뷰를 수동으로 렌더링 한 다음 렌더링 된 뷰를 JSON 응답의 일부로 다시 전달합니다.
이것은 각 엔티티의 책임을 보존합니다. 뷰는 여전히 뷰 엔진을 사용하여 위치하며 재사용 할 수 있습니다. 컨트롤러는 뷰의 이름과 모델 유형 외에는 거의 또는 전혀 알지 못합니다.
수동 액션 방법에
public static class RenderHelper
{
public static string PartialView(Controller controller, string viewName, object model)
{
controller.ViewData.Model = model;
using(var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(controller.ControllerContext, viewResult.View);
return sw.ToString();
}
}
}
렌더링 : 나는 익명의 유형을 반환하고있어
object model = null; // whatever you want
var obj = new {
someOtherProperty = "hello",
view = RenderHelper.PartialView(this, "_PartialName", model)
};
return Json(obj);
참고. 렌더링 된 뷰에 문자열 속성이있는 한 원하는 모든 (직렬화 가능) 유형을 반환 할 수 있습니다.
테스트
수동 렌더링을 사용하는 동작을 테스트하려면 약간의 수정이 필요합니다. 이는 MVC 파이프 라인에서 렌더링되는 것보다 조금 더 빨리 뷰를 렌더링하기 때문입니다.
- 는 액션 메소드를 입력 렌더링 수동
- 보기가 명시 적으로 < 렌더링 -이 어려운
- 종료 액션 메소드
자동 호출 조치를 테스트 할 수 있도록한다 렌더링
- 은 즉
(따라서 뷰 렌더링)
종료 액션 메소드 프로세스 뷰 결과를 뷰 결과를 작성 액션 메소드 를 입력, 우리의 수동 렌더링 프로세스가 개막 테스트를 어렵게 만드는 다양한 작업 (예 :보기를 컴파일하기 위해 빌드 관리자와 상호 작용). 보기의 실제 내용이 아닌 동작 방법을 테스트하려는 경우 호스트 된 환경에서 코드가 실행 중인지 확인할 수 있습니다.
public static string PartialView(Controller controller, string viewName, object model)
{
// returns false from a VS 2013 unit test, true from IIS
if(!HostingEnvironment.IsHosted)
{
// return whatever you want here
return string.Empty;
}
// continue as usual
}
(후드, 그것은 단순히 널 검사) HostingEnvironment.IsHosted
이 저렴 확인.
+1 도우미 클래스에 대해 생각하지 마십시오. 이것은 가장 우아한 해결책 일 것입니다. 나는 그것을 시도 할 것이다. 감사. – nthpixel
당신은 다음과 같이하고 싶지 않습니다 :'var obj = new {view = RenderHelper.PartialView (this, "_PartialName", viewModel), model = koViewModel}; 아니면 'foo'가 무엇입니까? 또는 나는 무엇인가 놓치고 있냐? – nwayve
@Dennis - 예, "foo"는 반환해야하는 다른 모든 데이터를 나타냅니다. 정확히 Knockout이 클라이언트에서 필요로하는 것은 확실하지 않지만보기에는 모델이 필요합니다 (null 인 경우에도). –