none
新人求助大神,构造方法传入很多参数时,如何设计比较合理? RRS feed

  • 问题

  • 求助,小弟我在设计一个类的构造方法时,发现需要传入很多参数,这些参数都是从前台aspx页面的控件获取的值,比如很多textbox、radiobuttonlist、dropdownlist等,不知道该怎样设计比较好,可以方便以后扩展,是把这些参数封装在一个info类里还是有别的什么好方法?自己上网查了一会,有人说可以传入Page,然后通过遍历page的contols来获取控件的值。可我试了好久,都没成功,可能是我使用了母版页的原因,请问要是用了母版页该怎样写代码呢?
    2013年6月19日 12:15

答案

  • 你可以考虑扩展Page类(为Page类定义扩展方法,专门获取这些控件的值),可以参考类似做法:

    1)专门创建一个静态类(MyPageExtender)。

    2)代码大致如下:

    namespace CSharp
    {
        public static class MyExtender
        {
            private static void GetControls<T>(Control parentControl,ICollection<T> controlCollectionwhere T : Control
            {
                if (parentControl.Controls.Count == 0 && (parentControl as T)!=null)
                {
                    controlCollection.Add(parentControl as T);
                    return;
                }
                foreach (Control control in parentControl.Controls)
                {
                    GetControls<T>(controlcontrolCollection);
                }
            }
     
            private static void GetControlsFromMasterPage<T>(Control parentControlICollection<T> controlCollectionwhere T : Control
            {
                if (parentControl.Controls.Count == 0 && (parentControl as T)!=null)
                {
                    controlCollection.Add(parentControl as T);
                    return;
                }
                foreach (Control item in parentControl.Controls)
                {
                    GetControlsFromMasterPage<T>(itemcontrolCollection);   
                }
            }
     
            public static void FindAllControls<T>(this TemplateControl controlICollection<T> controlCollection)where T:Control
            {
                if (control.Controls.Count == 0)
                {
                    controlCollection = null;
                    return;
                }
                foreach (Control item in control.Controls)
                {
                    GetControls<T>(itemcontrolCollection);
                }
            }
        }
    }

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年6月20日 5:54

全部回复

  • 可传入Hashtable,以索引键/值的配对组合,接受后再以索引键取出对应的值,可参考 http://msdn.microsoft.com/zh-tw/library/system.collections.hashtable(v=vs.80).aspx

    2013年6月19日 12:30
  • 我認類別的建構子不應該是取決你前端的輸入UI來決定

    前端的輸入,應該是指定給建構後的類別實體屬性

    或許您可以舉一個您的例子說明一下 , 為何建構子要取決你前端的輸入UI來決定


    軟體開發領域裡區區一個迷途工程師
    MyBook: HTML5 & JavaScript程式開發實戰 MyBlog: http://www.dotblogs.com.tw/ian/
    開發ASP.NET您要瞭解的基楚

    2013年6月19日 14:52
  • 你可以考虑扩展Page类(为Page类定义扩展方法,专门获取这些控件的值),可以参考类似做法:

    1)专门创建一个静态类(MyPageExtender)。

    2)代码大致如下:

    namespace CSharp
    {
        public static class MyExtender
        {
            private static void GetControls<T>(Control parentControl,ICollection<T> controlCollectionwhere T : Control
            {
                if (parentControl.Controls.Count == 0 && (parentControl as T)!=null)
                {
                    controlCollection.Add(parentControl as T);
                    return;
                }
                foreach (Control control in parentControl.Controls)
                {
                    GetControls<T>(controlcontrolCollection);
                }
            }
     
            private static void GetControlsFromMasterPage<T>(Control parentControlICollection<T> controlCollectionwhere T : Control
            {
                if (parentControl.Controls.Count == 0 && (parentControl as T)!=null)
                {
                    controlCollection.Add(parentControl as T);
                    return;
                }
                foreach (Control item in parentControl.Controls)
                {
                    GetControlsFromMasterPage<T>(itemcontrolCollection);   
                }
            }
     
            public static void FindAllControls<T>(this TemplateControl controlICollection<T> controlCollection)where T:Control
            {
                if (control.Controls.Count == 0)
                {
                    controlCollection = null;
                    return;
                }
                foreach (Control item in control.Controls)
                {
                    GetControls<T>(itemcontrolCollection);
                }
            }
        }
    }

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年6月20日 5:54
  • 这样调用:

     protected void Page_Load(object senderEventArgs e)
            {
                List<TextBox> textboxes = new List<TextBox>();
                Page.FindAllControls<TextBox>(textboxes);
                foreach (var item in textboxes)
                {
                    Response.Write(item.ID);
                }
                Page.Master.FindAllControls<Label>(……);
            }

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年6月20日 5:56