簡體   English   中英

如何在Asp.Net MVC中動態插入部分視圖

[英]How To Insert Partial views Dynamically in Asp.Net MVC

我正在將Webforms站點遷移到MVC。 在我的Webforms站點中,我的頁面利用了用戶控件的各種組合,然后是html塊,然后是Labels,Textboxes等。

我不想對每個頁面進行硬連線,所以我要從CMS驅動每個頁面的輸出,該CMS指定將控件插入頁面的順序。

我想每個控件現在將成為MVC中的部分視圖。 (讓我知道是否不正確)。

因此,如果我有兩個不同的局部視圖,即ViewA和ViewB,如何創建一個控制器方法,該方法將局部視圖插入按CMS為給定URL確定的順序返回的視圖中?

因此,假設控制器方法稱為Reports,並且它采用一個稱為product的參數。

例如// MySite / Reports?product = A返回一個包含ViewA,ViewA,ViewB,ViewA的視圖

// MySite / Reports?product = B返回包含ViewA,ViewB,ViewA,ViewB等的視圖

那么該代碼應用於控制器方法?

我希望這是有道理的

如果我對您的理解正確,那應該可以解決您的問題

只需創建一個從PartialViewResult派生的新類即可,該類接受多個視圖名稱來呈現它們。 為了使它更有用,請為控制器創建一個新的擴展方法,以調用您自定義的ViewResult。

那對我有用。 您可以簡單地使用它:

public ActionResult Index()
{
    return this.ArrayView(new string[] { "ViewA", "ViewB" });
}

為了使其工作,ArrayViewResult類應為:

public class ArrayViewResult : PartialViewResult
{
    public IEnumerable<string> Views;

    protected override ViewEngineResult FindView(ControllerContext context)
    {
        return base.FindView(context);
    }
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");
        if (!Views.Any())
            throw new Exception("no view...");


        TextWriter writer = context.HttpContext.Response.Output;

        foreach(var view in Views)
        {
            this.ViewName = view;
            ViewEngineResult result = FindView(context);

            ViewContext viewContext = new ViewContext(context, result.View, ViewData, TempData, writer);
            result.View.Render(viewContext, writer);

            result.ViewEngine.ReleaseView(context, result.View);
        }
    }
}

擴展方式:

namespace System.Web.Mvc
{
    public static class ArrayViewResultExtension
    {
        public static ArrayViewResult ArrayView(this Controller controller, string[] views)
        {
            return ArrayView(controller, views, null);
        }
        public static ArrayViewResult ArrayView(this Controller controller, string[] views, object model)
        {
            if (model != null)
            {
                controller.ViewData.Model = model;
            }

            return new ArrayViewResult
            {
                ViewName = "",
                ViewData = controller.ViewData,
                TempData = controller.TempData,
                ViewEngineCollection = controller.ViewEngineCollection,
                Views = views
            };
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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