5

これはかなり単純化されていますが、次のようになります。

単一の *.ascx ファイルのみで構成されるユーザー コントロールがあります。コントロールにはコード ビハインドはありません。これは、次のようないくつかの機能を備えた単なるスクリプトです。

<%@ Control Language="VB" EnableViewState="False" ClassName="MyControlType" %>
<script runat="server">
    Public Function MyFunction() As String
       return "CalledMyFunction!"
    End Function
</script>

それがファイル全体です。次のようなマークアップを使用して、このコントロールを aspx ページに正常に追加できます。

<%@ Register Src="~/path/to/Control.ascx" TagPrefix="aaa" TagName="MyControl" %>
...
<aaa:MyControl runat="server" id="MyControl1" />

ここで、次のように、ページのコード ビハインドから MyFunction を呼び出します。

Dim someString As String = MyControl1.MyFunction()

残念ながら、それはできません。'MyFunction' is not a member of 'System.Web.UI.UserControl'.代わりに、" "の影響でコンパイル エラーが発生します。

私もこれを試しました:

Dim someString As String = DirectCast(MyControl1, MyControlType).MyFunction()

そして、コンパイラは私に「Type 'MyControlType' is not defined.」と言います

私はこれでたくさん遊んできましたが、うまくいきません。他の回避策と同様に、MyControl1 をより正確な型にキャストする試みはすべて失敗しました。問題は、コード ビハインドのない ascx ファイルをアセンブリにコンパイルできないが、コード ビハインドをアセンブリにコンパイルする必要があるため、コンパイラがコントロールの型について混乱することだと思われます。

その関数を呼び出すにはどうすればよいですか?

[編集]
だから、ユーザー コントロールのコード ビハインドを追加する必要があります。とにかくやりたかったことです。ただし、これを必要とせずにこれを行う方法を知りたいです。

4

8 に答える 8

3

私にとっては奇妙な作品です。

Imports Microsoft.VisualBasic

Public Class MyControlType
    Inherits UserControl
End Class

.

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<%@ Register Src="~/WebUserControl.ascx" TagPrefix="aaa" TagName="MyControl"  %>
...
<aaa:MyControl runat="server" id="MyControl1"  />

.

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        Dim someString As String = MyControl1.MyFunction()
    End Sub

End Class

.

<%@ Control Language="VB" EnableViewState="False"  %>
<script runat="server">
    Public Function MyFunction() As String
       return "CalledMyFunction!"
    End Function
</script>
于 2008-12-11T21:42:31.150 に答える
0

これが私がしたことです。

  1. 新しいWebサイトを作成します。
  2. 新しいWebユーザーコントロールを追加する-そのダイアログの[コードを別のファイルに配置する]チェックボックスがオフになっていることを確認します。
  3. 生成された.ascxに関数を配置します
  4. default.aspxにコントロールを登録し、実行します

WebUserControl.ascxの内容

<%@ Control Language="VB" ClassName="WebUserControl" %>

<script runat="server"> Public Function MyFunction() As String Return "CalledMyFunction!" End Function </script>

Default.aspxの内容


<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<%@ Register Src="WebUserControl.ascx" TagPrefix="aaa" TagName="MyControl" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <aaa:MyControl runat="server" ID="mycontrolid" />
    <%
        Dim i As String = mycontrolid.MyFunction()
        Response.Write(i)
     %>
    </div>
    </form>
</body>
</html>
于 2008-12-12T01:45:44.450 に答える
0

WebUserControl から派生する必要があると思います。

.ascx "Control" タグに次を配置します。

Inherits="WebApplication1.WebUserControl1"

もちろん、適切な名前を使用する必要があります。

于 2008-12-11T21:41:33.897 に答える
0

Make sure that the MyControl1 object in your code-behind is of type MyControlType and is casted as such when calling that function. The compiler is stating that it cannot find the method MyFunction() in the base class of UserControl.

于 2008-12-11T20:59:33.403 に答える
0

私は VB をあまり使いません (C# の方が多いです) が、これは機能していると思います!

runat にタイプミスがあります:

<script ruant="server"> 

それを修正してみてください。

于 2008-12-11T21:35:02.523 に答える
0

この問題は、クラスを定義するコード ビハインド ファイルがないことに関係しています。public 関数をコード ビハインド ファイルに入れるとすぐに機能します。ASP.NET は、その関数をクラス内の実際の関数ではなく、匿名関数のように扱っていると思います。

それはとにかく私の考えです。

于 2008-12-11T23:23:16.720 に答える
-1

これをコードビハインド宣言に配置します

protected <solutionName>.<controlName> myControl1; /*C#*/

ここで、myControl1 はユーザー コントロールの ID です。これで、このコントロールのパブリック関数を呼び出すことができます。

于 2010-03-11T15:38:22.960 に答える