因此,像许多人一样,我正在尝试将旧的(并且非常大的)webforms应用程序迁移到MVC4应用程序。因为重写是令人生畏的(并且实际上不可行),我试图将应用程序包装在MVC应用程序中。从那里我们将重写部分。我有一个相当成功的HtmlHelper扩展,它呈现旧的webforms控件。它看起来像这样:
public static MvcHtmlString RenderClassicControl(this HtmlHelper html, string controlPath)
{
var sb = new StringBuilder();
var stWriter = new StringWriter(sb);
var htmlWriter = new HtmlTextWriter(stWriter);
var page = new Page();
page.PreInit += ((s, e) =>
{
var form = new HtmlForm();
form.ID = "Form";
form.Attributes.Add("enctype", "multipart/form-data");
page.Controls.Add(form);
var control = page.LoadControl(controlPath);
form.Controls.Add(control);
page.Controls.Add(form);
});
HttpContext.Current.Server.Execute(page, htmlWriter, true);
return new MvcHtmlString(sb.ToString());
}
我遇到的问题是,虽然呈现的html看起来与当前站点相同,但当我对该控件完成操作时,没有任何反应。请求集合中有些内容我希望看到(例如__EVENTTARGET),但它们是空的并且isPostback为false。我希望我在这里遗漏了一些东西,我希望有人有一些想法。非常感谢您抽出宝贵时间!
答案 0 :(得分:0)
Webforms事件驱动的环境。基于MVC的动作。在Web表单中,您将有一个辅助javascript函数,如__doPostBack
等,以处理由控件引发的正确事件
Webforms执行页面生命周期并挂钩__EVENTTARGET && __EVENTARGUEMENT
以匹配当前事件侦听器并触发它。这在MVC中是完全不同的
更好地开始将webform事件更改为MVC控制器操作,并将数据发布到服务器并以JSON或普通表单数据的形式处理
答案 1 :(得分:0)
我最终接受了Brian Ball的建议。我所做的只是添加default.aspx和masterpage并通过
加载我的控件