2009-08-21 28 views
11

Tôi muốn xây dựng một điều khiển người dùng giả sử MyDiv.ascx. Điều khiển này hiển thị thẻ div và thực hiện thêm vài mã phía sau các công cụ như thêm vài thuộc tính v.v ... mà không phải là vấn đề đáng lo ngại ở đây. Vấn đề là tôi muốn văn bản giữa các thẻ mở và đóng của điều khiển người dùng. Ví dụ:Nội dung không được phép giữa các thẻ mở và đóng để điều khiển người dùng

Văn bản đi kèm với một số thẻ HTML khác.

Vì vậy, khi làm điều gì đó như thế này, tôi gặp phải lỗi phân tích khi chạy trang web. Ngoài ra VS2008 cảnh báo tôi bằng cách nói rằng "Nội dung không được phép giữa các thẻ mở và đóng cho phần tử MyDiv".

  • Câu hỏi 1: Tôi có thể làm điều gì đó như thế này ví dụ text/đánh dấu giữa mở và thẻ đóng của một điều khiển người dùng?

  • Câu hỏi 2: Nếu có, làm thế nào

Trả lời

13

Tôi tin rằng bạn chỉ cần áp dụng một vài thuộc tính để kiểm soát:

[ParseChildren(false)] 
[PersistChildren(true)] 
public class MyDiv : UserControl 
{ 
    ... 

Bạn thể sau đó cần phải ghi đè AddedControl - Tôi không chắc chắn.

Đặt nó theo cách này - đó là những gì làm việc cho một và điều khiển người dùng duy nhất mà tôi đã từng viết :)

+0

Chà ... nó hoạt động như một nét duyên dáng ... Nhưng ... u có thể nói cho tôi biết làm thế nào tôi có thể nhận được html bên trong như tôi không nhận được loại tài sản này ... như ** this.InnerHtml hoặc this.Children ** .. ??? – Manish

+4

Bạn có thể sử dụng [ParseChildren (true, "Body")] với thuộc tính có tên "Body" của chuỗi kiểu. Điều này sẽ đặt nội dung của InnerHtml và đặt nó vào bất kỳ thuộc tính nào mà bạn đặt tên làm đối số thứ hai của bạn trong chú giải ParseChildren. –

0

Thêm một tài sản văn bản để kiểm soát của bạn và liên kết bất động sản văn bản này cho một người chạy nhãn tại máy chủ đó sẽ là giữa khai mạc và bế div.

+0

Đó là điều tôi không muốn làm ... Tôi muốn nó hoạt động giống như các thẻ thông thường ... – Manish

0

Bạn có thể muốn phải cẩn thận, nếu bạn đặt một điều khiển máy chủ trong khu vực nội dung ..

Bạn có thể chỉ muốn tạo điều khiển kế thừa từ bảng điều khiển và ghi đè bất kỳ phương pháp nào bạn cần điều chỉnh? Có thể dễ dàng hơn hoặc khó hơn tùy thuộc vào những gì bạn cần tùy chỉnh

public class MyDiv : Panel 
{ 

} 
+0

Tôi không thể làm điều này tôi đoán ... bcoz nó đã được thừa hưởng từ lớp UserControl ... vì vậy sẽ không thể kế thừa từ lớp khác ... là bất kỳ giao diện nào tôi có thể thực hiện? – Manish

17

Các giải pháp được đề xuất không phù hợp với tôi. Tôi đã tìm thấy các giải pháp sau: Hoặc là kiểm soát người dùng của bạn kế thừa từ Panel thay vì chỉ UserControl hoặc nếu bạn có nhiều nội dung như trong trường hợp của mình, hãy tạo trường nội dung của bạn là PlaceHolder s thay vì đơn giản Control s.

[PersistenceMode(PersistenceMode.InnerProperty)] được thêm vào để tránh cảnh báo xác thực XHTML.

public partial class DrawerControl : UserControl 
{ 
    [PersistenceMode(PersistenceMode.InnerProperty)] 
    public PlaceHolder BodyContent { get; set; } 
    [PersistenceMode(PersistenceMode.InnerProperty)] 
    public PlaceHolder GripContent { get; set; } 

    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     phBodyContent.Controls.Add(BodyContent); 
     phGripContent.Controls.Add(GripContent); 
    } 
} 

phBodyContentphGripContentPlaceHolder s.

Bằng cách này tôi có thể sử dụng kiểm soát của tôi với bất kỳ nội dung trong ASPX:

<local:Drawer ID="ctlDrawer" runat="server"> 
    <BodyContent> 
     <!--Insert any ASP content here--> 
    </BodyContent> 
    <GripContent> 
     <!--Insert any ASP content here--> 
    </GripContent> 
</local:Drawer> 
+0

Có thể sẽ cho một điều khiển tổng hợp (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.compositecontrol.aspx) một giải pháp tốt trong trường hợp của bạn. Bạn nói gì Mart? – Manish

+0

Tôi đã thêm chi tiết vào câu trả lời của mình để minh họa sự linh hoạt của giải pháp này. Tôi chuyển sang CompositeControls khi tôi phải nhúng điều khiển vào một hội đồng với các nguồn lực của nó để phân phối dễ dàng hơn. – Mart

+2

Một bổ sung mà tôi đề nghị ở đây là cũng null kiểm tra các đối tượng PlaceHolder mới trước khi thêm chúng vào phBodyContent, vv Nó làm việc tốt cho tôi khi tôi chỉ định một số BodyContent, nhưng sẽ lỗi nếu tôi không. – mattkgross

4

Tôi cũng muốn tạo ra một điều khiển tùy chỉnh với "innerHtml".Đây là những gì tôi đã kết thúc với (dựa một phần trên một số các câu trả lời trước đó/bình luận) ...

div.ascx.cs:

[ParseChildren(true, "Text")] //Store inner content in Text property 
public partial class div : System.Web.UI.UserControl 
{ 
    public string Text { get; set; } 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     litText.Text = Text; //Render it however you want 
    } 
} 

div.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="div.ascx.cs" Inherits="TestApp.Controls.div" %> 
<div> 
    <asp:Literal ID="litText" runat="server" /> 
</div> 

trang kiểm tra:

<%@ register src="~/Controls/div.ascx" tagname="div" tagprefix="uc" %> 
<uc:div ID="div1" runat="server">Test data</uc:div> 
+0

+1 cho cú pháp hoàn chỉnh –

2

tôi thấy điều này ở đây:

ASP.Net: User control with content area, it's clearly possible but I need some details

Làm việc như một sự quyến rũ, nhưng tôi muốn tôi có thể bỏ qua thông điệp thời gian thiết kế, nội dung không được phép giữa thẻ mở và đóng, nhưng nó hoạt động vào thời gian chạy.

[ParseChildren(true, "Content")] 

[PersistChildren(false)] 

public partial class CollapsiblePanelControl : UserControl 

{ 

    private Control content; 

    // add the content 
    this.MainContent.Controls.Add(content); 

    // if this is not a post back 
    if (!this.IsPostBack) 
    { 
     // set to true; 
     this.Expanded = true; 
    } 
} 

Các Markup là như thế này:

<asp:Panel ID="CollapsiblePanelMainPanel" runat="server" CssClass="collapsiblepanel"> 
    <asp:Panel ID="CollapsibleHeaderPanel" runat="server" CssClass="collapsibleheaderpanel"> 
     <asp:ImageButton ID="CollapseButton" ImageUrl="~/Images/BlueArrowDown.png" runat="server" OnClick="ExpandButton_Click" CssClass="expandbutton" /> 
     <asp:Label ID="CollapsiblePanelHeaderLabel" runat="server" Text="Collapsed" CssClass="collapsiblelabel"></asp:Label> 
    </asp:Panel> 
    <asp:Panel ID="MainContent" runat="server"> 
    </asp:Panel> 
</asp:Panel> 

Và sau đó trong ứng dụng:

<dc:CollapsiblePanelControl ID="CheckOnMePanel" runat="server" CssClass="checkonmepanel" EnableViewState="true" 
     CollapsedHeight="20px" ExpandedHeight="300px" Expanded="true" HeaderText="Check On Me Email Service" > 
    <Content> 
     ...[Your Content Goes Here] 
    </Content> 
</dc:CollapsiblePanelControl> 
+1

Câu trả lời hữu ích hơn nếu chúng chứa cú pháp/mã hợp lệ. –

Các vấn đề liên quan