أفضل طريقة لتعيين خاصية ValidationGroup لكل عنصر تحكم عالميًا في asp.net؟

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

  •  07-07-2019
  •  | 
  •  

سؤال

لدي عنصر تحكم المستخدم مع عناصر النموذج التي يتم إعادة استخدامها بشكل كبير عبر تطبيق ويب كبير، وحتى هذه النقطة تتم معالجة ملخص التحقق من الصحة عند إرسال نموذج غير صالح بواسطة .aspx الذي يستهلك عنصر تحكم المستخدم.

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

شيء من هذا القبيل:

For Each ctrl As System.Web.UI.Control In Me.Controls
   ' so now what is the proper way to detect if this control has the ValidationGroup property
Next

نموذج التعليمات البرمجية في vb.net أو c# يناسبني.تشكرات!

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

المحلول

يجب أن يكشف UserControl الخاص بك عن خاصية تقوم بتعيين خاصية ValidationGroup بشكل صحيح داخل نفسها.

التحكم في العلامات في .ASPX:

<ctl:yourcontrol id="whatever" runat="server" YourValidationGroupProp="HappyValidationName" />

رمز التحكم خلف .ASCX:

 protected override void OnPreRender(EventArgs e)
 {
     someControl.ValidationGroup = YourValidationGroupProp;
     someControl1.ValidationGroup = YourValidationGroupProp;
     someControl2.ValidationGroup = YourValidationGroupProp;
     //......etc
 }    

 public string YourValidationGroupProp{ get; set; }

نصائح أخرى

وإنشاء وراثة التحكم المخصصة، على سبيل المثال، الحرفي. وهذه السيطرة يكون نصيرا.

وسوف أدخله في الصفحة، أنها قد تفعل كل عمل القذر نيابة عنك. مثلا التوليف [التي من شأنها أن تأخذ الكثير من الوقت لكتابة] استنادا إلى بعض المنطق وبمجرد الانتهاء من ذلك معها.

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

في هذه الطريقة يمكنك تجنب كل الاخطاء من خلال وجود هذا الرقم الكمبيوتر من التعليمات البرمجية التي تريد كما رغبتكم ويمكنك الحصول على كل سرعة الثابت تلوينها التي ستعاني من خلال حل المشكلة مع أسلوب عام.

ولقد كنت في البحث عن الشيء نفسه، وأنه ضرب فجأة لي. I استخدام هذا الأسلوب لأمور أخرى [مسح جميع الضوابط والمخرجات بعض رمز الحرف الأول] ولكن أعتقد أنه يمكن استخدام هذه الطريقة للقيام بسهولة هذا كذلك!

ولقد كتب عليه، وانا ذاهب الى حصة معك

public class ValidationCodeProducerHelper : Literal
{
    // you can set this in the aspx/ascx as a control property
    public string MyValidationGroup { get; set; }

    // get last minute controls
    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        // start scanning from page subcontrols
        ControlCollection _collection = Page.Controls;
        Text = GetCode(_collection).Replace("\r\n", "<br/>");
    }

    private string GetCode(Control _control)
    {
        // building helper
        StringBuilder _output = new StringBuilder();

        // the logic of scanning
        if (_control.GetType().GetProperty("ValidationGroup") != null && !string.IsNullOrEmpty(_control.ID))
        {
            // the desired code
            _output.AppendFormat("{0}.{1} = {2};", _control.ID, "ValidationGroup", MyValidationGroup);
            _output.AppendLine();
        }

        // recursive search within children
        _output.Append(GetCode(_control.Controls));

        // outputting
        return _output.ToString();
    }

    private string GetCode(ControlCollection _collection)
    {
        // building helper
        StringBuilder _output = new StringBuilder();
        foreach (Control _control in _collection)
        {
            // get code for each child
            _output.Append(GetCode(_control));
        }
        // outputting
        return _output.ToString();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top