在mvc中渲染webforms控件:为什么回发和事件不能正确触发?

时间:2014-02-04 15:59:51

标签: c# asp.net asp.net-mvc-4 webforms

因此,像许多人一样,我正在尝试将旧的(并且非常大的)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。我希望我在这里遗漏了一些东西,我希望有人有一些想法。非常感谢您抽出宝贵时间!

2 个答案:

答案 0 :(得分:0)

Webforms事件驱动的环境。基于MVC的动作。在Web表单中,您将有一个辅助javascript函数,如__doPostBack等,以处理由控件引发的正确事件

Webforms执行页面生命周期并挂钩__EVENTTARGET && __EVENTARGUEMENT以匹配当前事件侦听器并触发它。这在MVC中是完全不同的

更好地开始将webform事件更改为MVC控制器操作,并将数据发布到服务器并以JSON或普通表单数据的形式处理

答案 1 :(得分:0)

我最终接受了Brian Ball的建议。我所做的只是添加default.aspx和masterpage并通过

加载我的控件