vb.net 不能从共享方法引用类的实例成员

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/26834086/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-17 18:27:12  来源:igfitidea点击:

Cannot refer to an instance member of a class from a shared method

asp.netvb.net

提问by Maverick

How you get a public shared function outside of a Protected Sub, use the values from within a protected sub to postBack to the same webpage. The postback reply works, but the query of the function fails at (Line 44 Char 17 "fqdom = dom & ".forest.local")

如何获得受保护子程序之外的公共共享函数,使用受保护子程序内的值回发到同一网页。回发回复有效,但函数查询在 (Line 44 Char 17 "fqdom = dom & ".forest.local") 处失败

Imports System
Imports System.IO
Imports System.DirectoryServices
Imports System.DirectoryServices.AccountManagement
Imports System.DirectoryServices.ActiveDirectory

Partial Class _Default 
 Inherits System.Web.UI.Page

Dim dom As String
Dim Group1 As String
Dim Group2 As String
Dim usrname As String
Dim fqdom As String
Dim netdom As String

Private Function GetDataFromArrayList() As ArrayList
    Dim DomainList As New ArrayList()
    DomainList.Add(New ListItem("d1", "dom1"))
    DomainList.Add(New ListItem("d2", "dom2"))
    Return DomainList
End Function

Protected Sub Selection_Changed(ByVal sender As Object, _
   ByVal e As System.EventArgs) Handles Me.Load

    If Not Page.IsPostBack Then
        For Each item As ListItem In GetDataFromArrayList()
            DropDownList1.Items.Add(item)
        Next
    End If
End Sub

Public Shared Function GetGroups() As ArrayList
    Dim groupList As New ArrayList()
    Dim usrname As String
    Dim fqdom As String
    'Dim netdom As String
    Dim groupCheck As String
    fqdom = dom & ".forest.local"

    Dim entry As System.DirectoryServices.DirectoryEntry
    Dim searcher As System.DirectoryServices.DirectorySearcher
    Dim result As System.DirectoryServices.SearchResult

    Try
        entry = New System.DirectoryServices.DirectoryEntry("LDAP://" & fqdom)
        searcher = New DirectorySearcher()
        searcher.SearchRoot = entry
        searcher.Filter = "(samAccountName=" & usrname & ")"
        searcher.PropertiesToLoad.Add("memberOf")
        result = searcher.FindOne()
        Dim groupCount As Integer = result.Properties("memberOf").Count
        For groupCounter As Integer = 0 To groupCount - 1
            groupCheck = CStr(result.Properties("memberOf")(groupCounter))
            groupCheck = groupCheck.Remove(groupCheck.LastIndexOf(",CN="))
            groupCheck = groupCheck.Replace("CN=", "")
            groupList.Add(groupCheck)
        Next groupCounter

    Catch ex As Exception

    End Try

    Return groupList
End Function


Protected Sub Button1_Click(ByVal sender As Object, _  
   ByVal e As System.EventArgs) Handles Me.Load

    If IsPostBack Then

        Dim name As Boolean = False

        If Not TextBox1.Text = String.Empty Then
            name = True
        End If


        If name = False Then
            StatusLabel.Text = "Update Status: Please Enter Name"

        ElseIf name = True Then


            Group1 = "groupb1"
            Group2 = "groupb2"

            Try
                form1.Visible = False
                Dim groups As New ArrayList()
                groups = GetGroups()
                Dim group As String
                For Each group In groups
                    'NameLabel.Text = group

                    If (group.Contains(Group1)) Then
                        Group1.Text = "User: " & usrname & " is in group1"
                    End If

                    If (group.Contains(Group2)) Then
                        Group1.Text = "User: " & usrname & " is in group2"
                    End If
                Next

                fqdn.Text = "Domain:  " & dom & ".forest.local"
                NameLabel.Text = "User: " & usrname

            Catch ex As Exception

            End Try

        Else
            StatusLabel.Text = "Upload status: Error Please Retry later"
        End If
    End If
End Sub
End Class 

回答by Tim Schmelter

Remove the Sharedkeywordfrom the method, so replace

从方法中删除Shared关键字,因此替换

Public Shared Function GetGroups() As ArrayList

with

Public Function GetGroups() As ArrayList

You cannot use instance variables like domfrom within a Sharedmethod.

您不能像domShared方法中那样使用实例变量。

You could also make those fields Shared. But that's not a good idea in ASP.NET since it could cause locks and concurrency issues and every request shared the same values(even of different users).

您也可以制作这些字段Shared。但这在 ASP.NET 中不是一个好主意,因为它可能导致锁定和并发问题,并且每个请求都共享相同的值(即使是不同用户的)。

It's also not necessary since you want to use that method from a page method(button-click), so you need an instance of the page anyway.

这也不是必需的,因为您想从页面方法(按钮单击)中使用该方法,因此无论如何您都需要页面的实例。

If you need to persist a value across postback you can use a different way like using ViewState, Session or a HiddenField.

如果您需要在回发中保留一个值,您可以使用不同的方式,例如使用 ViewState、Session 或 HiddenField。