如何使aspx页面只读?

时间:2016-06-15 10:03:44

标签: c# asp.net webforms

我有条件需要检查是否有任何属性 migrated ,然后将相关aspx页设置为 read-only

如下所示:但是,我需要在所有必需的页面上创建EnableControls(),这将增加代码行。

EnableControls(this.Page.Form.Controls, false); // will call this from Page_Load()

public void EnableControls(ControlCollection ctrl, bool isEnable)
{
    foreach (Control item in ctrl)
    {
        if (item.GetType() == typeof(Panel) || item.GetType() == typeof(HtmlGenericControl))
            EnableControls(item.Controls, isEnable);
        else if (item.GetType() == typeof(DropDownList))
            ((DropDownList)item).Enabled = isEnable;
        else if (item.GetType() == typeof(TextBox))
            ((TextBox)item).Enabled = isEnable;
        else if (item.GetType() == typeof(Button))
            ((Button)item).Enabled = isEnable;
        else if (item.GetType() == typeof(HtmlInputButton))
            ((HtmlInputButton)item).Disabled = !isEnable;
    }
}

有没有其他最简单的方法可以实现这一点,比如创建一个全局函数并从必需的 read-only 页面调用它?

谢谢!感谢任何更好的想法。

2 个答案:

答案 0 :(得分:1)

您可以在页面上使用Extension方法。

public static class PageExtensions{
    public static void EnableControls(this Page page,ControlCollection ctrl, bool isEnable)
            {
                if (ctrl == null)
                    ctrl = page.Controls;
                foreach (Control item in ctrl)
                {
                    if (item.Controls.Count > 0)
                        EnableControls(page, item.Controls, isEnable);

                    if (item.GetType() == typeof (DropDownList))
                        ((DropDownList) item).Enabled = isEnable;
                    else if (item.GetType() == typeof (TextBox))
                        ((TextBox) item).Enabled = isEnable;
                    else if (item.GetType() == typeof (Button))
                        ((Button) item).Enabled = isEnable;
                    else if (item.GetType() == typeof (HtmlInputButton))
                        ((HtmlInputButton) item).Disabled = !isEnable;
                }
            }
}

这样您就可以调用this.EnableControls(null,false)来禁用页面上的所有控件

答案 1 :(得分:1)

您可以创建一个IHttpModule来截取页面,通过Reflection检查它是否是一个只读页面,并根据它禁用它的控件。

 public class ReadOnlyModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.PreRequestHandlerExecute += (_o, _e) =>
            {
                var handler = ((HttpApplication)_o).Context.CurrentHandler;

                var page = handler as Page;
                if (page != null)
                {
                    page.PreRender += (o, e) =>
                    {
                        var readonlyPropertyInfo = o.GetType().GetProperty("IsReadonly");
                        var shouldMakeItReadonly = readonlyPropertyInfo != null && (bool)readonlyPropertyInfo.GetValue(o) == true;
                        var isEnable = !shouldMakeItReadonly;
                        EnableControls(((Page)o).Controls, isEnable);
                    };

                }
            };
        }

        public void EnableControls(ControlCollection ctrl, bool isEnable)
        {
            foreach (Control item in ctrl)
            {
                if (item.HasControls())
                    EnableControls(item.Controls, isEnable);
                else if (item is WebControl)
                    ((WebControl)item).Enabled = isEnable;
                else if (item is HtmlControl)
                    ((HtmlControl)item).Disabled = !isEnable;
            }
        }

        public void Dispose()
        {

        }
    }

httpModules部分注册此模块,然后您可以在特定页面中实现IsReadonly属性。

作为奖励,您还可以在标记(aspx)文件中添加此属性,并依赖于ASP .Net编译。

使用案例

您可以将IsReadonly属性放在后面的代码中(default.aspx.cs)

 public partial class _Default : Page
    {
        public bool IsReadonly
        {
            get
            {
                return true;
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {

        }
    }

或者在.aspx文件本身,只要你像这样使用它

<script runat="server">
    public bool IsReadonly { get { return true; } }
</script>

enter image description here