2016-07-07 5 views
0

У меня есть два приложения, написанные в виде aspx-страницы, а другое в MVC5-бритве cshtml.Share Razor Partial View in WebForms iFrame

Веб-форма имеет встроенный iframe, и я хочу загрузить файл cshtml razor внутри iframe, когда пользователь нажимает кнопку.

Я искал и нашел полезные сообщения для смешивания веб-форм и страниц MVC, чтобы я мог показать страницу MVC на странице aspx webforms.

How to use ASP.Net MVC View inside WebForms .aspx page?

How to include a partial view inside a webform

на основе пост выше, я создал класс MvcUtility в моем приложении MVC под новую папку под названием хелперы.

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 я создал новую страницу 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> 

Однако, когда я запустить приложение, я получаю ошибку ниже

Частичный вид PartialRender не найден. Поиск мест: ~/Просмотры/Dummy/PartialRender.aspx ~/Просмотры/Dummy/PartialRender.ascx ~/Просмотры/Shared/PartialRender.aspx ~/Views/Shared/PartialRender.ascx ~/Views/Dummy/PartialRender. cshtml ~/Просмотров/Dummy/PartialRender.vbhtml ~/Просмотров/Shared/PartialRender.cshtml ~/Просмотров/Shared/PartialRender.vbhtml

и имя вида возвращается в нуль в приведенном ниже коде, когда я попытался отладить заявку

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

Может кто-нибудь, пожалуйста, помогите мне и сообщите мне, где Я не прав?

ответ

0

Я только что столкнулся с тем же вопросом, следуя тем же руководствам, что и вы упомянуты выше.

Я считаю, что причина в том, что мое решение имеет вид в области MVC. Я использовал ответ @ devundef здесь Can I specify a custom location to “search for views” in 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); 
    } 

После этого частичный вид теперь может быть расположен. Но после этого я столкнулся с другой ошибкой.

No route in the route table matches the supplied values.

я обнаружил, что нужно добавить «область» в маршрутизации данных следующим образом:

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, поэтому я надеюсь, что я получил мою терминологию правильно.

+0

Спасибо за информацию. Я это попробую. –

Смежные вопросы