2012-12-19 7 views
1

@RenderPage와 컨트롤러의 동작 모두에 의해 호출되는 부분 뷰가 하나 있습니다. 여기 asp.net mvc3 : 컨트롤러에서 RenderPage에 의해 호출되도록 설계된 부분 뷰로 매개 변수를 전달하는 방법은 무엇입니까?

코드와 함께 파라미터를 전달 @RenderPage 또 다른 관점에서 호출되는 PageData [] :

 @foreach (var subTree in itemTree.SubTrees) 
     { 
      <li id ="@("LiOf" + subTree.Root.ID)" style = "margin-top: 0px"> 
       @RenderPage("~/Areas/MFC/Views/Items/_SubItemsTree.cshtml", subTree, itemTreeViewModel, false, Request.RawUrl, showOpenAsTreeRoot) 
      </li> 
     } 

BTW이 부분 뷰가 여러 번 렌더링 될 있도록 "TREENODE가" 한 번의 전화로 특정 노드 필요가 리프레시 할 때

그리고 여기가 모델 및 ViewBag에 매개 변수를 전달하는 컨트롤러의 행동 코드입니다,이 조치가 호출됩니다

var fatherTree = ItemTree.ItemTreeOf(item.FatherID); 
    ViewBag.IsSubtreeRoot = true; 
    ViewBag.ReturnUrl = returnUrl; 
    ViewBag.ItemTreeViewModel = new ItemTreeViewModel(
     view, fatherTree, whats, types, 
     showPopupOperationMenu: true, showMoveLeftRight: true, showMoveUpDown: true); 
    ViewBag.ShowOpenAsTreeRoot = true; 
    return View("~/Areas/MFC/Views/Items/_SubItemsTree.cshtml", fatherTree); 

가 제대로하려면 2 케이스는, 렌더링 할 뷰는 다음과 같이이다 :

@model ItemTree 
@using Martian.Areas.MFC.Models; 
@{ 
    var itemTree = (PageData[0] as ItemTree) ?? Model; 
    var itemTreeViewModel = PageData[1] ?? ViewBag.ItemTreeViewModel as ItemTreeViewModel; 
    var isSubtreeRoot = (bool) (PageData[2] ?? ViewBag.IsSubtreeRoot); 
    var returnUrl = PageData[3] ?? ViewBag.ReturnUrl as string; 
    var showOpenAsTreeRoot = (bool)(PageData[4] ?? ViewBag.ShowOpenAsTreeRoot); 

을 그리고 네, 아직 잘 작동 어색하게 보인다. 부분 뷰 팩은 @Html.RenderPartial이 아닌 @RenderPage에 의해 호출되도록 전송해야하며 일부 동작으로도 반환해야하는 경우 문제가 될 수 있습니다. 더 좋은 방법이 있습니까? 감사합니다. .


2013년 1월 19일 고통스러운 아직 실행 가능한 솔루션은 여기에 있습니다 :

뇌의 기차 즉 : 우리가 Controller.View에 하나 개 이상의 매개 변수를 전달할 수 있다면, 우리는 그것을 전달할 수 있습니다 PageData []로 cshtml에 추가하십시오.

1 단계 수정 컨트롤러에서 전화 :

public ActionResult AjaxRemoveUser(int departmentID, int teamID, string userName, int udcTypeValue) 
    { 
     var team = _repMFC.ReadItemAt<Department>(teamID); 
     team.RemoveUser(udcTypeValue, userName); 
     return MFCView("AssignMembers/_AjaxTeam", _repMFC.ReadItemAt<Department>(departmentID), team, true); 
    } 

2 단계는 MFCController 대신 컨트롤러에서 컨트롤러를 파생. MFCController는 다른 이유로 이전에 설계된 클래스이며 모든 컨트롤러는이 클래스에서 파생됩니다.

public ActionResult MFCView(string ajaxViewName, params object[] list) 
    { 
     var ajaxViewPath = ((BuildManagerCompiledView) (ViewEngines.Engines.FindPartialView(ControllerContext, ajaxViewName).View)).ViewPath; 
     var viewModel = new MFCViewModel { AjaxViewPath = ajaxViewPath, PageData = list }; 
     return View("~/Views/Shared/_MFCView.cshtml", viewModel); 
    } 

3 단계 MFCViewModel :

public class MFCViewModel 
    { 
     public string AjaxViewPath; 
     public object[] PageData; 
    } 

그것은 매우 분명 똑바로 앞으로 MFCController에서

은 다음과 같습니다 MFCView의 몸()가있다.

4 단계 ~/조회수 뷰 AssignMembers/_AjaxTeam.cshtml에서/공유는/_MFCView.cshtml

@model Martian.Areas.MFC.Models.MFCController.MFCViewModel 
@{ 
    @RenderPage(Model.AjaxViewPath, Model.PageData) 
} 

5 단계 : 나는 주제의 맨 처음에 설명한 바와 같이 , 그것은 사용 같이 :

var department = (PageData[0]??ViewBag.Department) as Department; 
var team = (PageData[1]??ViewBag.Team) as Department; 
var enableEditMembers = (bool)(PageData[2]??ViewBag.EnableEditMembers); 

그리고 지금은 사실이다 :

var department = PageData[0] as Department; 
var team = PageData[1] as Department; 
var enableEditMembers = (bool) PageData[2]; 

이제 페이징 ata는 MFCView()에 전달 된 매개 변수에 의해 생성됩니다.

비록 프로세스가 힘들지 만 일단 작업을 마친 후에는 U, ViewBag, No ViewData [], 심지어 ViewModel없이 많은 매개 변수를 전달할 수 있습니다. u는 일반 메소드를 호출하는 것 같습니다!

답변

0

내가 대신 RenderPage의 @Html.RenderAction을 사용할 수 있습니다 생각합니다. 그런 다음 작업을 설계하고 매개 변수를 전달하고 부분 뷰를 선택할 수 있습니다.

이것에 대해 좋은 블로그 here 있습니다. 당신의 추천에 대한

+0

감사합니다. 그러나 일부는 더 나은 성능을 얻을 대신 RenderAction의 RenderPage를 사용하는 경우 그래서 더 나은 시간의 수백 때마다, 렌더링 될 것 "TREENODE"입니다. Ajax 작업으로 새로 고쳐야 할 때만 내 작업에 의해 호출됩니다. RenderAction이 상대적으로 느리다고 생각하니? – cheny

+0

좋은 지적. 리플렉션을 기반으로하는 전체 컨트롤러 메커니즘을 시작해야하므로 RenderAction이 느려질 수 있습니다. 그러나 나는 결코 성과를 측정하지 못했습니다. – slfan