Есть ли способ визуализировать обычный вид действия MVC asp.net на старый .aspx
WebForm с помощью помощника MVC или какого-либо другого метода?
Ввод ASP.NET MVC на страницу WebForms
Ответ 1
Отказ от ответственности: предлагаемое решение ниже - взлом.
Предположим, что у вас есть следующий контроллер:
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>
Ответ 2
Я использовал этот код в своем 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();
...
...
}
...
}
Ответ 3
Я думаю, что проще всего использовать скрипты на стороне клиента. Например, используя jQuery.Load