在 WebForms iFrame 中共享 Razor Partial View

本文关键字:Razor Partial View 共享 WebForms iFrame | 更新日期: 2023-09-27 17:55:29

我有两个应用程序,一个是用aspx Web表单编写的,另一个是用MVC5 razor cshtml编写的。

Web 表单中嵌入了一个 iframe,我想在用户单击按钮时将 razor cshtml 文件加载到 iframe 中。

我搜索并找到了一些有用的帖子来混合网络表单和 MVC 页面,以便我可以在网络表单 aspx 页面中显示 MVC 页面。

如何在WebForms.aspx页面中使用 ASP.Net MVC视图?

如何在 Web 窗体中包含分部视图

基于上面的帖子,我在一个名为 Helpers 的新文件夹下在我的 MVC 应用程序中创建了一个 MvcUtility 类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Desk.Web.Client.Controllers;
using Desk.Web.Client.Models;
namespace Desk.Web.Client.Helpers
{
    public class RazorPartialBridge
    {
        private static void RenderPartial(string partialViewName, object model)
        {
            HttpContextBase httpContextBase = new HttpContextWrapper(HttpContext.Current);
            RouteData routeData = new RouteData();
            routeData.Values.Add("controller", "Dummy");
            ControllerContext controllerContext = new ControllerContext(new RequestContext(httpContextBase, routeData), new DummyController());
            IView view = FindPartialView(controllerContext, partialViewName);
            ViewContext viewContext = new ViewContext(controllerContext, view, new ViewDataDictionary { Model = model }, new TempDataDictionary(), httpContextBase.Response.Output);
            view.Render(viewContext, httpContextBase.Response.Output);
        }
        //Find the view, if not throw an exception
        private static IView FindPartialView(ControllerContext controllerContext, string partialViewName)
        {
            ViewEngineResult result = ViewEngines.Engines.FindPartialView(controllerContext, partialViewName);
            if (result.View != null)
            {
                return result.View;
            }
            StringBuilder locationsText = new StringBuilder();
            foreach (string location in result.SearchedLocations)
            {
                locationsText.AppendLine();
                locationsText.Append(location);
            }
            throw new InvalidOperationException(String.Format("Partial view {0} not found. Locations Searched: {1}", partialViewName, locationsText));
        }
        //Here the method that will be called from MasterPage or Aspx
        public static void RenderAction(string controllerName, string actionName, object routeValues)
        {
            RenderPartial("PartialRender", new RenderActionViewModel() { ControllerName = controllerName, ActionName = actionName, RouteValues = routeValues });
        }
    }
}

如帖子中所述。然后我在模型文件夹中创建了一个类(RendeActionViewModel),代码是

namespace Desk.Web.Client.Models
{
    public class RenderActionViewModel
    {
        public string ControllerName { get; set; }
        public string ActionName { get; set; }
        public object RouteValues { get; set; }
    }
}

我在控制器文件夹下创建了一个虚拟控制器

public class DummyController : Controller
    {
      public ActionResult PartialRender()
      {
          return PartialView();
      }
    }

然后我在视图文件夹下创建了一个名为 PartialRender.cshtml 的视图。

    @model RenderActionViewModel
<h1>Hello World</h1>
<p>
    I was rendered from a <strong>@Model.Source</strong>!
</p>

在我的 asp.net Web 窗体应用程序的 Web 窗体中,我创建了一个新的 aspx 页并添加了以下代码。

    <%@ Page Title="Demo" Language="C#" 
    AutoEventWireup="true" Inherits="Demo" Codebehind="Demo.aspx.cs" %>
<html>
<head></head>
<body>
    <% RazorPartialBridge.RenderPartial("_Partial", new RenderActionViewModel() { Source = "ASPX Page" }) %>
</body>
</html>

但是,当我运行该应用程序时,我收到以下错误

部分

视图 找不到部分渲染。搜索的地点: ~/views/Dummy/PartialRender.aspx ~/Views/Dummy/PartialRender.ascx ~/views/Shared/PartialRender.aspx ~/Views/Shared/PartialRender.ascx ~/views/Dummy/PartialRender.cshtml ~/Views/Dummy/PartialRender.vbhtml ~/views/Shared/PartialRender.cshtml ~/views/Shared/PartialRender.vbhtml

当我尝试调试应用程序时,视图名称在下面的代码中返回为 null

ViewEngineResult result = ViewEngines.Engines.FindPartialView(controllerContext, partialViewName);

谁能帮助我,让我知道我错在哪里?

在 WebForms iFrame 中共享 Razor Partial View

按照您上面包含的相同指南,我刚刚遇到了同样的问题。

我相信原因是我的解决方案具有MVC区域的观点。我在这里使用了@devundef的答案 我可以指定自定义位置以 ASP.NET MVC 中的"搜索视图"吗?以解决定位局部视图的问题。

我的区域注册如下:

public class MVCAreaRegistration : AreaRegistration 
{
    public override string AreaName 
    {
        get 
        {
            return "MVC";
        }
    }
    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "MVC_default",
            "MVC/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );           
    }
}

我在 Global.asax 中有以下内容

protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
        AreaRegistration.RegisterAllAreas();
        ViewEngines.Engines.Clear();
        var razorEngine = new RazorViewEngine();
        razorEngine.MasterLocationFormats = razorEngine.MasterLocationFormats
              .Concat(new[] {
      "~/Areas/MVC/{0}.cshtml"
              }).ToArray();
        razorEngine.PartialViewLocationFormats = razorEngine.PartialViewLocationFormats
              .Concat(new[] {
      "~/Areas/MVC/Views/{1}/{0}.cshtml",
      "~/Areas/MVC/Views{0}.cshtml",          
              }).ToArray();
        ViewEngines.Engines.Add(razorEngine);
    }

之后,现在可以定位部分视图。但在那之后,我遇到了另一个错误。

路由

表中没有与提供的值匹配的路由。

我发现我需要将"区域"添加到路由数据中,如下所示:

private static void RenderPartial(string partialViewName, object model)
    {
        HttpContextBase httpContextBase = new HttpContextWrapper(HttpContext.Current);
        RouteData routeData = new RouteData();
        routeData.Values.Add("controller", "WebFormsUtility");
        routeData.Values.Add("area", "MVC"); //Added area to routeData
        ControllerContext controllerContext = new ControllerContext(new RequestContext(httpContextBase, routeData), new WebFormsUtilityController());
        IView view = FindPartialView(controllerContext, partialViewName);
        ViewContext viewContext = new ViewContext(controllerContext, view, new ViewDataDictionary { Model = model }, new TempDataDictionary(), httpContextBase.Response.Output);
        view.Render(viewContext, httpContextBase.Response.Output);
    }

我对 MVC 相当陌生,所以我希望我的术语是正确的。