我有一个现有的 VB.NET web 项目需要一些新的屏幕 (webforms)。由于多种原因,这些新屏幕将使用 C# 开发。仔细阅读后发现这确实是可能的:Adding C# Web Form to VB Web Application和 add c# user control to existing asp.net vb.net project
不过我做了一个小测试:
- 包含 VB WebForms 应用程序项目的 VB.NET 解决方案
- 向解决方案添加了一个新的 C# ASP.NET 项目
- 在 C# 程序集中创建 Web 用户控件
- 在 1 中的 Default.aspx 中引用和使用 Web 用户控件。
问题是用户控件没有显示在页面上。我在这里错过了什么。这在 VB.NET WebForms 应用程序中是不可能的吗?下面是相关代码:
Default.aspx
<%@ Page Title="Home Page" Language="VB" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.vb" Inherits="waWithCUserControl._Default" %>
<%@ Register TagPrefix="uac" Namespace="waUserControls" Assembly="waUserControls" %>
<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
<uac:UcTakeTest ID="myUserControl" runat="server" />
</asp:Content>
单独程序集 waUserControls 中的用户控件
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ucTakeTest.ascx.cs" Inherits="waUserControls.UcTakeTest" %>
<link href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css" rel="stylesheet">
<div class="container">
<div class="row">
<div class="col-md-2">
<div class="list-group">
<a href="#" class="list-group-item active">Question</a>
<a href="#" class="list-group-item">Question</a>
<a href="#" class="list-group-item">Question</a>
<a href="#" class="list-group-item">Question</a>
<a href="#" class="list-group-item">Question</a>
<a href="#" class="list-group-item">Question</a>
<a href="#" class="list-group-item">Question</a>
<a href="#" class="list-group-item">Question</a>
<a href="#" class="list-group-item">Question</a>
<a href="#" class="list-group-item">Question</a>
</div>
</div>
</div>
</div>
最佳答案
您需要将标记(仅限 ASCX 文件)从 C# 项目构建到您的 VB Web 应用程序项目中,并引用那些 ASCX 而不是 C# 的。听起来很奇怪,但相信我,它确实有效。
1 - 将构建后事件添加到 C# 项目,将 UserControl 标记(仅 .ASCX 文件)复制到 Web 应用程序项目中的文件夹;例如,在您的 Web 应用程序的根目录下有一个名为“ExternalUserControls”的文件夹
(请注意,它们应该具有相同的 Inherits 属性,即来自 C# 项目的命名空间和类名。)
2 - 确保引用了 C# 项目(听起来好像已经引用了)
3 - 添加控件声明到 <controls>
节<pages>
的 <system.web>
在 web.config 中:-
<system.web>
.
.
<pages>
<controls>
<add tagPrefix="cc"
src="~/ExternalUserControls/MyControl.ascx"
tagName="MyControl" />
<add .... etc
4 - 如此引用页面中的控件:-
<cc:MyControl id="testControl" runat="server" ..
5 - 确保你 Import
C# 项目中定义的控件的正确命名空间
6 - 请注意,有时 VS 页面设计器会拒绝为您的控件添加变量,因此为了在代码隐藏中访问您的控件,您需要添加页面级 protected
。 (或者 VB 的等价物是什么,我不记得了)正确类型的变量,使用与页面标记中相同的名称(上面示例中的 testControl)
如果你想要一个例子,请告诉我。
关于VB.NET 中的 C# Webforms 用户控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20559292/