【问题标题】:Asp.net web forms control in asp.net mvcasp.net mvc中的asp.net web表单控件
【发布时间】:2011-05-23 10:21:20
【问题描述】:

我正在尝试向我的 asp.net mvc 应用程序注入一个 asp.net 经典 Web 控件。此控件不使用视图状态或回发,因此可以正常工作。

但我无法在其属性中插入实时提供的值。这段代码

<my:Control runat="server" Tag="<%: Model.ID %>" />

以刚刚明确设置为“”的标记值结束。 有没有办法让它工作?

【问题讨论】:

  • 出于好奇,您要使用什么类型的“经典”asp.net web 控件?
  • 它是我在切换到 mvc 之前在 asp.net webforms 中使用的文件上传的第三方控件。它只是为 silverlight 应用程序呈现适当的 html 标记

标签: asp.net asp.net-mvc asp.net-mvc-3


【解决方案1】:

我相信语法如下:

<my:Control runat="server" Tag="<%# Model.ID %>" />

另一个问题是您必须在控件初始化后的某个时间点对控件调用 .DataBind()。这可能意味着使用 Page 的 Page_Load 或 OnInit 事件。

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<script runat="server">
    protected override void OnInit(EventArgs e)
    {
        this.Label1.DataBind();
        base.OnInit(e);
    }
</script>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Home Page
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2><%= Html.Encode(ViewData["Message"]) %></h2>

    <asp:Label ID="Label1" runat="server" Text="<%# DateTime.Now %>" />
</asp:Content>

或者,如果您可以访问源代码,您可以在最终渲染之前的某处添加对 .DataBind() 的调用。您必须对此进行试验。

希望这会有所帮助。

【讨论】:

  • 感谢您的回复,但这仅适用于经典的 asp.net 应用程序(asp.net 网络表单),不适用于 asp.net mvc
  • 上面的代码在 ASP.NET MVC 应用程序中运行良好。据我所知,没有其他方法可以调用 .DataBind(),除非您可以访问控件源代码,在其中可以手动添加对 .DataBind() 的调用。
  • 添加 OnInit 处理程序将在 asp.net webforms 中工作,但我相信不在 mvc 中。我认为是的,将调用添加到控件源中某处的 DataBind() 将是最好的解决方案,但不幸的是我无权访问它
  • 如果使用默认的 ASP.MVC 视图引擎,您可以添加/调用 OnInit 页面处理程序。我没有测试过其他 View 引擎(如 Razor),虽然我怀疑它没有什么不同,但我可能错了。
  • 你能举个例子来说明如何重写 OnInit 函数吗?我正在使用默认的 asp.net mvc 视图引擎
【解决方案2】:

好吧,似乎唯一的方法就是将控件呈现到页面的代码直接注入。在我的例子中,控件使用一些 javascript 呈现一个 silverlight 对象,所以我将它按原样放在页面上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多