I frequently create User Controls in our WSS 3.0 environment use SmartPart to deploy them.
Below is an example of a user control not using code-behind.
LastBAUserLogin.ascx
<%@ Control Language="VB" ClassName="LastBAUserLogin" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Web.Configuration" %>
<%@ Import Namespace="System.Web.UI.UserControl" %>
<script runat="server">
</script>
<asp:UpdatePanel ID="MyUpdatePanel" runat="server">
<ContentTemplate>
</ContentTemplate>
</asp:UpdatePanel>
This is an example utilizing code-behind
staff.directory.ascx
<%@ Control Language="VB" AutoEventWireup="false" codeFile="staff.directory.ascx.vb" Inherits="StaffDirectory" %>
<asp:UpdatePanel ID="MyUpdatePanel" runat="server">
<ContentTemplate>
</ContentTemplate>
</asp:UpdatePanel>
staff.directory.ascx.vb
Partial Class StaffDirectory
Inherits System.Web.UI.UserControl
End Class