@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는 일반 메소드를 호출하는 것 같습니다!
감사합니다. 그러나 일부는 더 나은 성능을 얻을 대신 RenderAction의 RenderPage를 사용하는 경우 그래서 더 나은 시간의 수백 때마다, 렌더링 될 것 "TREENODE"입니다. Ajax 작업으로 새로 고쳐야 할 때만 내 작업에 의해 호출됩니다. RenderAction이 상대적으로 느리다고 생각하니? – cheny
좋은 지적. 리플렉션을 기반으로하는 전체 컨트롤러 메커니즘을 시작해야하므로 RenderAction이 느려질 수 있습니다. 그러나 나는 결코 성과를 측정하지 못했습니다. – slfan