J'ai un contrôleur appelé ProductsController et j'utilise la méthode d'index pour charger la vue d'index avec un formulaire Web appelé WebForm1.aspx. La vue d'index a été configurée et fonctionne correctement. Maintenant, je veux ajouter un iframe dans la vue d'index pour afficher le contenu de WebForm1.aspx. Les deux vues sont dans le même dossier Vues/Produits dans le projet MVC. J'ai fait ce qui suit:
<iframe src="/ProductsController/Index?WebForm1.aspx" width="1000" height="400">
</iframe>
my Views/web.config est défini comme suivant:
et l'héritage WebForm est le suivant:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
Cependant, les iframe affichent un message d'erreur: "HTTP 404 - La ressource que vous recherchez (ou l'une de ses dépendances) aurait pu être supprimée, si son nom avait été modifié ou si elle était temporairement indisponible."
J'ai aussi essayé d'ajouter à mon fichier global.asax la ligne suivante:
RouteTable.Routes.RouteExistingFiles = true;
mais a échoué aussi,
La façon unique dont iFrame est affiché mais vide consiste à utiliser le chemin physique complet comme suit:
<iframe src="C\:Folder1\Folder2\ ...\Views\Products\WebForm1.aspx" width="1000" height="400">
</iframe>
quelqu'un peut-il expliquer pourquoi cela ne fonctionne pas? Et comment le faire fonctionner? Je vous remercie.
Vous devez placer votre fichier .aspx (webform) hors du dossier de vues, car normalement tout appel provenant du navigateur est bloqué par le "BlockViewHandler" (visible dans le fichier web.config du dossier de vues).
Dans tout autre dossier que vous créez, cela devrait fonctionner sans contrôleur. Par exemple, si vous le mettez dans "/webforms/webform1.aspx", ce chemin est celui à utiliser avec l'iframe.
UPDATEVoici un exemple avec les nouvelles informations de la question, espérons que cela pourra vous aider:
Le controlle:
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
}
}
Le contenu de Products Index.html, appelant le fichier aspx via un iframe:
@{
ViewBag.Title = "Index title";
}
<h2>Index</h2>
Calling aspx file from iframe:
<iframe src="@Url.Action("ActionThatRetrieveAndAspx","Products")" width="1000" height="400"></iframe>
Le contenu de 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>
Vous pouvez indiquer l'emplacement réel du fichier Webform.aspx.
<iframe src="/FolderPath/WebForm1.aspx" width="1000" height="400">
</iframe>
Votre code suppose que le runtime MVC examine un dossier appelé "ProductsController" et un sous-dossier appelé "Index".
Si votre fichier Webform1.aspx se trouve réellement dans cette structure de répertoire, remplacez l'attribut src par src="/ProductsController/Index/WebForm1.aspx"
.
Je mets le formulaire Web dans le dossier racine du projet MVC et l'appelle comme suit:
<iframe src="~/webform.aspx"...></iframe>
Je ne le mentionne pas dans le contrôleur.
Un bon bonus à cette technique est que vous pouvez facilement revenir à votre site Web MVC en ouvrant des liens de navigation dans le formulaire Web dans target = "_ parent".