【发布时间】:2010-11-22 11:38:59
【问题描述】:
有没有办法使用 MVC 帮助程序或其他方法将 asp.net MVC 操作的正常视图呈现到旧的 .aspx WebForm 上?
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-mvc-2
有没有办法使用 MVC 帮助程序或其他方法将 asp.net MVC 操作的正常视图呈现到旧的 .aspx WebForm 上?
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-mvc-2
免责声明:以下建议的解决方案是一种黑客攻击。
假设您有以下控制器:
public class HomeController : Controller
{
[ChildActionOnly]
public ActionResult Foo()
{
return View();
}
}
以及相应的部分 (Foo.ascx)。
现在您想在旧版 WebForms 页面中使用此操作。以下是您可以进行的操作:
<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO" %>
<script type="text/C#" runat="server">
private class DummyController : Controller { }
public HtmlHelper Html { get; private set; }
protected void Page_Load(object sender, EventArgs e)
{
var httpContext = new HttpContextWrapper(Context);
var controllerContext = new ControllerContext(
httpContext,
new RouteData(),
new DummyController()
);
var viewContext = new ViewContext(
controllerContext,
new WebFormView("Views"),
new ViewDataDictionary(),
new TempDataDictionary(),
TextWriter.Null
);
Html = new HtmlHelper(viewContext, new ViewPage());
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%= Html.Action("About", "Home") %>
</div>
</form>
</body>
</html>
【讨论】:
controllerContext 传递给 WebFormView 构造函数以使其编译。
RenderAction 工作,执行上述步骤,将TextWriter.Null 更改为Response.Output 并将<%= 更改为<%。
我在我的 MasterPage 中使用了这段代码,它工作正常。但是几天后我发现我的应用程序由于内存泄漏而每分钟都在重新启动。我一直在寻找原因,最后,这部分代码是内存泄漏的原因。你必须处理 DummyController 和 ViewPage。我已经这样解决了:
public class BaseMaster : System.Web.UI.MasterPage
{
#region MVC
Controller _controller= new DummyController();
ViewPage _viewPage = new ViewPage();
private class DummyController : Controller { }
public HtmlHelper Html { get; private set; }
private void InitHtmlHelper()
{
var httpContext = new HttpContextWrapper(Context);
var controllerContext = new ControllerContext(
httpContext,
new RouteData(),
_controller
);
var viewContext = new ViewContext(
controllerContext,
new WebFormView(controllerContext,"Views"),
new ViewDataDictionary(),
new TempDataDictionary(),
TextWriter.Null
);
Html = new HtmlHelper(viewContext, _viewPage);
}
public override void Dispose()
{
base.Dispose();
_controller.Dispose();
_viewPage.Dispose();
}
#endregion
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
InitHtmlHelper();
...
...
}
...
}
【讨论】:
我认为最简单的方法是使用客户端脚本。例如使用jQuery.Load
【讨论】: