Jag har spanat runt en del på nätet och letat efter ett enkelt sätt att komma åt propertys i en sida, ifrån en usercontrol placerad på sidan.
De exempel jag har hittat beskriver det såhär i usercontrollen, typ :
1: 'VB.NET
2: Dim pageTitle As String = Nothing
3: If TypeOf (Page) Is SamplePage Then
4: pageTitle = CType(Page, SamplePage).Title
5: Else
6: pageTitle = "unknown"
7: End If
På vilket sätt fungerar det inte? Koden ser rätt ut, även om det är onödigt att typomvandla till SamplePage. Title-egenskapen finns ju där ändå.
Jo, det är sant, title finns ju ändå. Men om jag skapar en ny sida med namnet (classnamnet) SamplePage, med en publik property "testprop" så känner inte usercontrollen igen "SamplePage" när jag provar nedanstående kod.
(webform)
Partial Class SamplePage
Inherits System.Web.UI.Page
Private _testProp As Integer
Public Property TestProp() As Integer
Get
Return _testProp
End Get
Set(ByVal value As Integer)
_testProp = value
End Set
End Property
End Class
(usercontrol)
Partial Class uc1
Inherits System.Web.UI.UserControl
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim tp As Integer
If TypeOf (Page) Is SamplePage Then
tp = CType(Page, SamplePage).TestProp
End If
End Sub
End Class
"SamplePage is not defined" blir svaret, men detta ska tydligen fungera under .net 1.0
Det verkar som om du använder "Web Site" i ASP.NET 2.0. Inte det bästa Microsoft hittat på, men det går att kringgå. Det bästa är dock, tycker jag, att man väljer "Web Application" i stället (kräver SP1 av Visual Studio)
Problemet är att sidor (Page-klasserna) och kontroller i en Web Site inte har något med varandra att göra. De lever fristående liv och därför har inte "uc1" en aning om vad en "SamplePage" är. För att de ska få kontakt med varandra får man skapa en gemensam nämnare i mappen App_Code, gärna i form av ett interface.
I mappen App_Code:
Namespace MinWebSite
Public Interface ISamplePage
Property TestProp() As Integer
End Interface
End Namespace
och modifieringar på de existerande filerna
Partial Class SamplePage
Inherits System.Web.UI.Page
[b]Implements MinWebSite.ISamplePage[/b]
Private _testProp As Integer
Public Property TestProp() As Integer [b]Implements MinWebSite.ISamplePage.TestProp[/b]
Get
Return _testProp
End Get
Set(ByVal value As Integer)
_testProp = value
End Set
End Property
End Class
Partial Class uc1
Inherits System.Web.UI.UserControl
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim tp As Integer
If TypeOf (Page) Is [b]MinWebSite.ISamplePage[/b] Then
tp = CType(Page, [b]MinWebSite.ISamplePage[/b]).TestProp
End If
End Sub
End Class
För min del känns inte det här som rätt väg att gå. Varför behöver du komma åt innehåll från Page i din UserControl? En UserControl används ju för att bygga ut Page och återanvända kontroller, inte tvärtom.
Pace, det är egentligen i första hand en fråga om att jag inte vill känna mig begränsad, och därför "vill veta". Det går bra att komma åt propertys i en masterpage ifrån en webform, och då känns det bra att veta hur jag kommunicerar mellan uc och page, om det dyker upp en sådan situation.
Ville inte lämna "testet" utan att ha fått ordning på det! :)
För min del känns inte det här som rätt väg att gå. Varför behöver du komma åt innehåll från Page i din UserControl? En UserControl används ju för att bygga ut Page och återanvända kontroller, inte tvärtom.
Helt rätt. Det är definitivt inte att rekommendera att gå den här vägen. Det är bättre att sidan hämtar information från kontrollen, snarare än att kontrollen skjuter in information i sidan.
Pace, det är egentligen i första hand en fråga om att jag inte vill känna mig begränsad, och därför "vill veta". Det går bra att komma åt propertys i en masterpage ifrån en webform, och då känns det bra att veta hur jag kommunicerar mellan uc och page, om det dyker upp en sådan situation.
Jämför med valfri metod på ett objekt. Du skickar in parametrar till metoden, metod(parameter), och får ett resultat tillbaka (exempelvis return true). Du ska inte låta instansen av objektet själv hämta det kallande objektet (i det här fallet Page) och försöka lägga in parametrar den vägen.
Som sagt, omvärdera ditt tankesätt eftersom det strider mot gällande normer för att bygga objektorienterade lösningar. Det kommer att skapa mer problem i framtiden än vad du löser för tillfället.
Andreas vill ju bara veta hur det gick till, och nu vet han dessutom att det inte är en bra idé. Dock kan man inte vara helt kategorisk. Det kan finnas lägen då det är fullständigt rimligt och korrekt att en kontroll kommunicerar med den underliggande, anropande sidan, och då behövs den nämnda tekniken.
268 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2