iframe 在 MVC 视图中加载 asp.net web 表单

Posted

技术标签:

【中文标题】iframe 在 MVC 视图中加载 asp.net web 表单【英文标题】:iframe in an MVC view to load asp.net web form 【发布时间】:2013-03-05 06:20:21 【问题描述】:

我有一个名为 ProductsController 的控制器,我使用 index 方法加载索引视图,其中包含一个名为 WebForm1.aspx 的 Web 表单,索引视图已设置并正常工作。现在我想在索引视图中添加一个 iframe 来显示 WebForm1.aspx 的内容。两个视图都位于 MVC 项目中的同一文件夹 Views/Products 中。我做了以下事情:

    <iframe src="/ProductsController/Index?WebForm1.aspx"  >

    </iframe>

我的 Views/web.config 设置为下一个:

WebForm 继承如下:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>

但 iframe 显示错误消息:“HTTP 404 - 您正在查找的资源(或其依赖项之一)可能已被删除、更改名称或暂时不可用。”

我还尝试将下一行添加到我的 global.asax 文件中:

RouteTable.Routes.RouteExistingFiles = true;

但也失败了,

我让 iFrame 显示但为空的独特方式是使用完整的物理路径作为下一个:

    <iframe src="C\:Folder1\Folder2\ ...\Views\Products\WebForm1.aspx"  >

    </iframe>

有人可以解释为什么它不起作用吗?以及如何让它发挥作用?谢谢。

【问题讨论】:

【参考方案1】:

您可以指向 Webform.aspx 文件的实际位置。

<iframe src="/FolderPath/WebForm1.aspx"  >

    </iframe>

您的代码假定 MVC 运行时将查看一个名为“ProductsController”的文件夹和一个名为“Index”的子文件夹

如果你的 Webform1.aspx 文件确实在那个目录结构中,请将 src 属性更改为src="/ProductsController/Index/WebForm1.aspx"

【讨论】:

【参考方案2】:

你应该把你的 .aspx 文件(webform)放到views 文件夹之外,因为通常来自浏览器的任何调用都会被“BlockViewHandler”(你可以在views 文件夹的web.config 文件中看到)阻止。

在您创建的任何其他文件夹中,它应该在没有控制器的情况下工作。 例如,如果您将它放在“/webforms/webform1.aspx”中,那么该路径就是在 iframe 中使用的路径。

更新以下是问题中新信息的示例,希望对您有所帮助:

控制器:

public class ProductsController : Controller

    public ActionResult Index()
    
        return View(); //Razor file in  Views/Products/Index.cshtml
    

    public ActionResult ActionThatRetrieveAndAspx()
    
        return View("WebForm1"); //Aspx file Views/Products/WebForm1.aspx
    

Products Index.html的内容,通过iframe调用aspx文件:

@
    ViewBag.Title = "Index title";


<h2>Index</h2>

Calling aspx file from iframe:

<iframe src="@Url.Action("ActionThatRetrieveAndAspx","Products")"  ></iframe>

Products WebForm1.aspx的内容:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Title</title>
    </head>
    <body style="background-color: #999999; padding: 10px;">
        This is ActionThatRetrieveAndAspx WebForm1.aspx
    </body>
</html>

【讨论】:

"/webforms/webform1.aspx",你的意思是webforms直接在项目根路径下吗?如果是这样,它不起作用。 这是第二个答案...我的意思是,如果你有一个继承自 System.Web.UI.Page (WebForm1.aspx) 的 aspx 文件,那么应该放置那种文件在 Views 文件夹之外,这样您就可以通过“普通”url 调用它,而无需通过控制器传递请求……另一种 aspx 是从“System.Web.Mvc.ViewPage”继承的那些文件的行为作为 Razor 文件,应放置在 views 文件夹中,并且请求通过控制器。 感谢您的解释,更新了我的问题,请看一下。【参考方案3】:

我把webform放到MVC项目的根目录下,这样调用:

<iframe src="~/webform.aspx"...></iframe> 

我没有在控制器中引用它。

这项技术的一个不错的好处是,您可以通过在 target="_parent" 中打开 webform 中的导航链接来轻松导航回您的 MVC 网站

【讨论】:

以上是关于iframe 在 MVC 视图中加载 asp.net web 表单的主要内容,如果未能解决你的问题,请参考以下文章

如何从字节数组 c# MVC .NET Core 在 iframe 中显示 pdf

在 ASP.NET Core 2 中处理异常的推荐方法? [关闭]

跟我学ASP.NET MVC之十一:URL路由

处理 OAuth 2.0 身份验证 - 在 ASP.NET MVC 应用程序中获取令牌重定向令牌响应

mvc中的异步页面加载

ASP.NET MVC中jQuery与angularjs混合应用传参并绑定数据