压缩c#dnn模块设置代码

时间:2012-01-08 14:54:29

标签: c# properties settings dotnetnuke

这是我在大多数DNN设置模块中使用的代码块,但它的功能似乎过于冗长。您如何将其浓缩以使其更有用或至少更少冗余?

    /// -----------------------------------------------------------------------------
    /// <summary>
    /// LoadSettings loads the settings from the Database and displays them
    /// </summary>
    /// -----------------------------------------------------------------------------
    public override void LoadSettings()
    {
        try
        {
            if (Page.IsPostBack == false)
            {
                ddlTreeTabId.DataSource = GetTabs();
                ddlTreeTabId.DataBind();
                if (!string.IsNullOrEmpty((string)TabModuleSettings["TreeTabID"]))
                {   //Look for the tree tab id
                    this.ddlTreeTabId.SelectedValue = (string)TabModuleSettings["TreeTabID"];
                    //If we're here, we have a tab module id, now we can grab the modules on that page
                    LoadTabModules(ddlTreeModuleID, int.Parse((string)TabModuleSettings["TreeTabID"]));

                    //we only do this part if the proceeding steps checked out
                    //if we have a tree module id 
                    if (!string.IsNullOrEmpty((string)TabModuleSettings["TreeModuleID"]))
                    {
                        try
                        {
                            //carefully try to select that item from the module id drop down list
                            this.ddlTreeModuleID.SelectedValue = (string)TabModuleSettings["TreeModuleID"];
                        }
                        catch (Exception ex)
                        { //There may have been a module id but it aint on that page any more.  Ignore the error.
                            // I hate invoking try just to ignore an error. seems wasteful.
                        }
                    }
                }
        }
        catch (Exception exc) //Module failed to load
        {
            Exceptions.ProcessModuleLoadException(this, exc);
        }
    }

我理想的解决方案是以这样的方式实现属性:在整个模块中,可以返回树模块ID而无需键入所有这些。

if (!string.IsNullOrEmpty((string)Settings["TreeTabID"]) &&
    !string.IsNullOrEmpty((string)Settings["TreeModuleID"]))
{
    Do_SomethingWithTheIDs(
        int.Parse((string)Settings["TreeTabID"]), 
        int.Parse((string)Settings["TreeModuleID"]));
}

想象一下加载这样的几个模块的复杂性。啊。


更新

感谢Olivier,我写了一个新类来管理属性

public class TreeSettingsBase : ModuleSettingsBase
{
    public int? TreeTabID
    {
        get
        {
            string s = (string)Settings["TreeTabID"];
            int id;
            return Int32.TryParse(s, out id) ? id : (int?)null;
        }
    }

    public int? TreeModuleID
    {
        get
        {
            string s = (string)Settings["TreeModuleID"];
            int id;
            return Int32.TryParse(s, out id) ? id : (int?)null;
        }
    }

    public int? PersonTabID
    {
        get
        {
            string s = (string)Settings["PersonTabID"];
            int id;
            return Int32.TryParse(s, out id) ? id : (int?)null;
        }
    }

    public int? PersonModuleID
    {
        get
        {
            string s = (string)Settings["PersonModuleID"];
            int id;
            return Int32.TryParse(s, out id) ? id : (int?)null;
        }
    }
}

所以现在我的LoadSettings看起来像这样:

public override void LoadSettings()
    {
        try
        {
            if (Page.IsPostBack == false)
            {
                ddlTreeTabId.DataSource = GetTabs();
                ddlTreeTabId.DataBind();               
                if (TreeTabID.HasValue)
                {   
                    this.ddlTreeTabId.SelectedValue = TreeTabID.ToString();
                    LoadTabModules(ddlTreeModuleID, TreeTabID.Value);
                    if (TreeModuleID.HasValue)
                    {
                        try
                        {
                            this.ddlTreeModuleID.SelectedValue = TreeModuleID.ToString();
                        }
                        catch (Exception ex)
                        { 
                        }
                    }
                }
                ddlPersonTabId.DataSource = GetTabs();
                ddlPersonTabId.DataBind();
                if (PersonTabID.HasValue)
                {
                    this.ddlPersonTabId.SelectedValue = PersonTabID.ToString();
                    LoadTabModules(ddlPersonModuleID, PersonTabID.Value);
                    if (PersonModuleID.HasValue)
                    {
                        try
                        {
                            this.ddlPersonModuleID.SelectedValue = PersonModuleID.ToString();
                        }
                        catch (Exception ex)
                        {
                        }
                    }
                }

            }
        }
        catch (Exception exc) //Module failed to load
        {
            Exceptions.ProcessModuleLoadException(this, exc);
        }
    }

ModuleSettingsBase随处可用,因此TreeTabID,TreeModuleID,PersonTabID和PersonModuleID也是如此。这就是我想要的,它使用的代码更少,所以感谢Olivier!

抛弃 try catch 会很好,但是不能保证该值会出现在下拉列表中,否则会更小。虽然更好。

1 个答案:

答案 0 :(得分:2)

为您的设置创建一个包装类。

public class TabModuleSettingsWrapper {

   private SettingsCollection _settings; // I do not know of which type your settings are.

   public TabModuleSettingsWrapper(SettingsCollection settings) {
       _settings = settings;
   }

   public int? TreeModuleID { 
        get { 
            string s = (string)_settings["TreeModuleID"];
            int id;
            return Int32.TryParse(s, out id) ? id : (int?)null;
        }
   }

   // Repeat this for all the settings
}

现在您可以使用以下方式访问设置:

var settings = new TabModuleSettingsWrapper(TabModuleSettings);
if (settings.TreeTabID.HasValue &&  settings.TreeModuleID.HasValue) {
    Do_SomethingWithTheIDs(settings.TreeTabID, settings.TreeModuleID);
}