【问题标题】:Rendering webforms controls in mvc: Why are Postback and Events not triggering correctly?在 mvc 中渲染 webforms 控件:为什么回发和事件没有正确触发?
【发布时间】:2014-02-28 16:53:39
【问题描述】:

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

【问题讨论】:

  • 如果没有时间重写,为什么要将其转换为 MVC?是因为您希望网站上的新开发工作使用 MVC?如果是这样,两人可以在same site 上并肩生活。我猜测为什么回发没有发生是因为 WebForms 依赖的还有一个或 JS 文件,但在您的 MVC 页面中没有引用。
  • 当然是的,但也因为我试图放弃一个非常旧的 DotNetNuke 版本,该版本从未正确实现,并且在 .net 4 中表现不佳
  • 为什么不将旧的 webforms 控件转换为 MVC 用户控件,然后将它们呈现为部分或操作? stackoverflow.com/questions/12714071/…
  • 因为我试图替换的 DotNetNuke 框架对每个页面都使用了用户控件。我真的没有时间全部转换。
  • 我想我不明白为什么要引入 MVC。我要么继续使用与你拥有的 DotNetNuke 版本兼容的框架版本,要么尝试替换你所拥有的具有较新版本的 ASP.NET Webforms。通过使用 MVC,您正在尝试升级和更改架构,同时这样做非常痛苦,应该尽可能避免。

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


【解决方案1】:

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

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

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

【讨论】:

  • 是否 HttpContext.Current.Server.Execute(page, htmlWriter, true);不执行整个页面生命周期?
  • @JeffLauder,它可能会执行映射的处理程序。但是像 EVENTTARGET 等发布数据来处理事件呢?你将如何获得它。
  • 我的印象是最后一个参数允许传递 System.Web.HttpContext.Current.Request 对象。那不是您所指的帖子数据的存储位置吗?还是 MVC 以某种方式对其进行了修改?
【解决方案2】:

我最终接受了 Brian Ball 的建议。我所做的只是添加一个 default.aspx 和母版页并通过它加载我的控件

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    相关资源
    最近更新 更多