![](/img/trans.png)
[英]Pass a css class from controller to a partial view in asp.net mvc3
[英]asp.net mvc3: How to pass parameters from controller to a partial view which is designed to be called by RenderPage?
我有一個局部視圖,它會同時被@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>
}
順便說一句,此局部視圖是一個“ treeNode”,因此將通過一次調用多次渲染。
這是控制器的操作中的代碼,該代碼通過Model和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);
為了在兩種情況下都能正常工作,要渲染的視圖如下所示:
@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);
是的,它運作良好,但看起來很尷尬。 由於我有一包局部視圖,因此需要通過@RenderPage而不是@ Html.RenderPartial進行調用,並且也需要通過某些操作將它們返回,這將是一個問題。 有什么更好的方法嗎? 謝謝。
2013-01-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而不是controller和派生控制器。 MFCController是我們之前出於其他一些原因而設計的類,我們所有的控制器均從該類派生。
在MFCController中,有MFCView()的主體,如下所示:
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;
}
這非常清楚和直接。
第4步。〜/ Views / Shared / _MFCView.cshtml
@model Martian.Areas.MFC.Models.MFCController.MFCViewModel
@{
@RenderPage(Model.AjaxViewPath, Model.PageData)
}
步驟5.在視圖AssignMembers / _AjaxTeam.cshtml中:正如我在本主題一開始所描述的,它過去看起來像:
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];
現在,由我們傳入MFCView()的參數創建PageData。
盡管該過程看起來很痛苦,但是一旦完成工作,您就可以使用MFCView傳遞所需的任意數量的參數,而無需ViewBag,ViewData []甚至ViewModel! 看來您正在調用普通方法!
我認為您可以使用@Html.RenderAction
代替RenderPage。 然后,您可以設計一個動作,傳遞參數並選擇局部視圖。
有一個很好的博客點擊這里了解這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.