有没有办法使用MVC助手或其他方法,将ASP.NET MVC操作的普通视图呈现在旧的.aspx
WebForm上?
有没有办法使用MVC助手或其他方法,将ASP.NET MVC操作的普通视图呈现在旧的.aspx
WebForm上?
免责声明:以下提出的解决方案是一种hack。
假设你有以下控制器:
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>
我在我的主页面中使用了这段代码,它可以正常工作。但是几天后,我发现我的应用程序由于内存泄漏而每分钟重新启动一次。我花了几天时间来寻找原因,最终发现这段代码是内存泄漏的原因。你需要处理 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();
...
...
}
...
}
RenderAction
正常工作,请按照上述步骤操作,并将TextWriter.Null
更改为Response.Output
,并将<%=
更改为<%
。 - leppie