簡體   English   中英

asp.net mvc3:如何將參數從控制器傳遞到旨在由RenderPage調用的局部視圖?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM