كيف يمكنني تضمين ترميز إضافي ضمن خاصية "محتوى" داخلي لـ ASP.NET WebControl؟

StackOverflow https://stackoverflow.com/questions/2745886

سؤال

لقد بحثت في الموقع ولا يمكنني العثور على حل لمشكلتي ، لذا أعتذر إذا تم الرد عليه بالفعل (أنا متأكد من أن شخصًا ما يجب أن يكون قد طلب ذلك من قبل).

لقد كتبت نافذة منبثقة jQuery التي قمت بتعبئتها باعتبارها webcontrol و iscriptcontrol. الخطوة الأخيرة هي أن تكون قادرًا على كتابة العلامات ضمن علامات سيطرتي. لقد استخدمت سمة Innerproperty عدة مرات ، ولكن فقط لتضمين قوائم الفصول المكتوبة بقوة.

ها هي خاصتي على WebControl:

[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public something??? Content
{
   get
   {
      if (_content == null)
      {
         _content = new something???();
      }
      return _content;
   }
}
private something??? _content;

إليك علامة HTML لما أنا بعد:

   <ctr:WebPopup runat="server" ID="win_Test" Hidden="false" Width="100px" Height="100px"
      Modal="true" WindowCaption="Test Window" CssClass="window">
      <Content>
         <div style="display:none;">
            <asp:Button runat="server" ID="Button1" OnClick="Button1_Click" />
         </div>
         <%--Etc--%>
         <%--Etc--%>
      </Content>
   </ctr:WebPopup>

لسوء الحظ ، لا أعرف نوع خاصية المحتوى الخاصة بي. أنا في الأساس بحاجة إلى تكرار UpdatePanelContentTemplate.

تعديل: إذن ما يلي يتيح إنشاء حاوية قالب تلقائيًا ، ولكن لا تظهر أي عناصر تحكم ، ما الخطأ في ما أفعله؟

[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ITemplate Content
{
    get
    {
        return _content;
    }
    set
    {
        _content = value;
    }
}
private ITemplate _content;

EDIT2: يتيح تجاوز CreateChildControls أن يتم تقديم عناصر التحكم داخل لوحة العنصر:

protected override void CreateChildControls()
{
   if (this.Content != null)
   {
      this.Controls.Clear();
      this.Content.InstantiateIn(this);
   }
   base.CreateChildControls();
}

لسوء الحظ ، لا يمكنني الآن الوصول إلى عناصر التحكم داخل لوحة العنصر من ملف CodebeHind على الملف. أي إذا وضعت زرًا داخل علامتي على النحو التالي:

<ctr:WebPopup runat="server" ID="win_StatusFilter">
   <Content>
      <asp:Button runat="server" ID="btn_Test" Text="Cannot access this from code behind?" />
   </Content>
</ctr:WebPopup>

بعد ذلك لا أستطيع الوصول btn_Test من الكود وراء:

protected void Page_Load(object sender, EventArgs e)
{
   btn_Test.Text = "btn_Test is not present in Intellisense and 
      is not accessible to the page. It does, however, render correctly.";
}

EDIT3: مُثَبَّت! تحرير 2 هو الحل الصحيح. كان مجرد استوديوهات بصرية 2010 كونها ألم في الأرداف. أغلقت التطبيق وأعيد فتحه ، وكانت جميع عناصر التحكم الخاصة بي داخل خاصية المحتوى متاحة على الصفحة.

EDIT4: تحرير 2 لم يصلح المشكلة. لقد جربت بالفعل [TemplateInstance(TemplateInstance.Single)] سمة قبل أن يذكرها أي شخص ، ولكن في ذلك الوقت لم أكن أعتقد أنه أحدث فرقًا. يبدو أن Visual Studios 2010 غريبة اليوم.

منذ أن أزلت العلامة واستمرت في العمل ، افترضت أن السمة لم تحدث فرقًا. منذ العودة إلى الكود مرة أخرى ، أصبحت عناصر التحكم غير متوفرة. سمحت إضافة السمة مرة أخرى في العمل ، ولكي تكون عناصر التحكم في جانب الخادم المتاح. جنون. سأقبل إجابة براين كما ذكر الإصلاح أمام أي شخص آخر.

هل كانت مفيدة؟

المحلول

محتوى لوحة العناصر العامة

الذي تقدمه إلى واجهة المستخدم مثل:

Label label = new Label();
this.Content.InstantiateIn(label);

//Render label

تحرير: تأكد من تعريف القالب أيضًا

[TemplateInstance(TemplateInstance.Single)]

لأن هذا يتيح لك الوصول إلى عناصر التحكم داخل القالب مباشرة.

نصائح أخرى

يجب أن تحاول استخدام هذا:

win_StatusFilter.FindControl("btn_Test") // this will be a Control
win_StatusFilter.FindControl("btn_Test") as Button // this will be a Button if control found, otherwise it will be null.

وإلا يجب عليك تحديد بعض الخصائص لسيطرتك ، كما في هذه المقالة:http://msdn.microsoft.com/ru-ru/library/36574bf6٪28v=vs.90٪29.aspx


تحديث: وفقًا لتصريحات هذه المقالة حول خاصية ContentTemplate من updatePanel:

http://msdn.microsoft.com/en-us/library/system.web.ui.updatepanel.contentTemplate(v=vs.90).aspx

يمكنك الحصول على عناصر تحكم من ContentTemplate بسبب قيمة templateInstanceAttribut TemplateInstance.Single).

لذلك يجب عليك استخدام هذا الرمز فقط:

[PersistenceMode(PersistenceMode.InnerProperty)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
[TemplateInstance(TemplateInstance.Single)]
public ITemplate Content

مزيد من المعلومات في:

http://msdn.microsoft.com/ru-ru/library/system.web.ui.templateinstanceattribute(v=vs.90).aspx

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top