我们正在将大型ASP.NET WebForms应用程序迁移到ASP.NET MVC3,并且遇到了一个希望有人可以帮助我们的小障碍。
我们有一小部分网站将暂时作为WebForms实现保留,直到我们可以将其迁移到MVC3,这很好,我们已成功混合网站来实现这一目标。
但是,我们需要能够使用现在应该通过新的MVC3区域实现生成的内容替换我们在WebForms页面上的一些现有UserControl实现 - 有没有办法从内部执行MVC3区域一个经典的WebForms页面?
答案 0 :(得分:3)
确定;答案似乎是使用标准的Html.Action扩展方法创建一个调用所需区域的局部视图:
@Html.Action("Index", "Home", new { Area = "HelloWorld" })
需要虚拟控制器:
public class WebFormController : Controller { }
然后我们可以使用我们的虚拟对象获取一个ControllerContext,从那里我们可以得到部分视图并渲染它:
public class WebFormMvcUtil
{
public static string RenderPartial(string partialName, object model)
{
var httpContextWrapper = new HttpContextWrapper(HttpContext.Current);
var routeData = new RouteData();
routeData.Values.Add("controller", "WebFormController");
var controllerContext = new ControllerContext(new RequestContext(httpContextWrapper, routeData),
new WebFormController());
IView view = ViewEngines.Engines.FindPartialView(controllerContext, partialName).View;
ViewContext viewContext;
var stringBuilder = new StringBuilder();
using (var stringWriter = new StringWriter(stringBuilder))
{
viewContext = new ViewContext(controllerContext, view, new ViewDataDictionary {Model = model}, new TempDataDictionary(), stringWriter);
view.Render(viewContext, viewContext.Writer);
}
return stringBuilder.ToString();
}
}
这归结为能够放置一个简单的
<%= WebFormMvcUtil.RenderPartial("_Area", null) %>
在WebForms页面中,所需的区域将呈现。
答案 1 :(得分:0)
您可以创建一个服务器控件来调用MVC-3路由以接收要显示的HTML。 Server Control只是呈现收到的HTML代码。从WebControl派生并覆盖Render方法。服务器控件的示例,您可以查找here。
要从MVC-3获取代码,您可以使用WebRequest对象,如下所示:
WebRequest request = WebRequest.Create ("http://www.mypage.com/mvcroute");
HttpWebResponse response = (HttpWebResponse)request.GetResponse ();
Stream dataStream = response.GetResponseStream ();
using (StreamReader reader = new StreamReader (dataStream))
{
string responseFromServer = reader.ReadToEnd ();
// render response to output
}