Как создать элемент управления с ValidationGroup и пользовательской проверки? - PullRequest
3 голосов
/ 08 октября 2010

Я хочу сделать панели Visibility true или false на основе результата Func.

У меня есть страница с элементами управления, как в следующем коде:

<asp:Panel ID="Panel2" runat="server">
    <asp:Panel ID="Panel3" runat="server">
        <c:PermissionPanel ID="P1" runat="server" ValidationGroup="Val1">
            Validation Group 1 - OK
        </c:PermissionPanel>
    </asp:Panel>
</asp:Panel>

<c:PermissionPanel ID="P2" runat="server" ValidationGroup="Val1">
    Validation Group 1 - OK
</c:PermissionPanel>

<hr />

<c:PermissionPanel ID="P3" runat="server" ValidationGroup="Val2">
    Validation Group 2 - OK
</c:PermissionPanel>

<asp:Panel ID="Panel4" runat="server">
    <asp:Panel ID="Panel1" runat="server">
        <c:PermissionPanel ID="P4" runat="server" ValidationGroup="Val2">
            Validation Group 2 - OK
        </c:PermissionPanel>
    </asp:Panel>
</asp:Panel>

Короче, у меня есть 4 PermissionPanel, который может быть внутри других элементов управления.

Код PermissionPanel следующий:

public class PermissionPanel : Panel
{
    public delegate bool OnValidate();
    public event OnValidate Validate;

    public string ValidationGroup { get; set; }

    protected override void OnPreRender(EventArgs e)
    {
        this.Visible = (Validate != null ? Validate() : false);

        base.OnPreRender(e);
    }
}

Я хочу получитьвсе PermissionPanel s со страницы и добавить событие для каждого соответственно в его группу, например:

protected void Page_Load(object sender, EventArgs e)
{
    // Magic code here. Linq is very welcome
    // GetPageControls<PermissionPanel>("Val1").AddEvent(() => return true);
    // GetPageControls<PermissionPanel>("Val2").AddEvent(() => return false);
}

Приведенный выше код сделает все панели с ValidationGroup == Val1 видимыми, в то время как Val2 не будет обработано.

Итак, вопросы : Как мне этого добиться?Есть ли лучший способ сделать это?


Короче говоря, я хочу добавить Func, который будет методом проверки, позволяющим показывать панели или нет.Реальный пример:

// If post owner is the logged user, show controls like edit and delete
() => return (user != null && user.ID == post.UserID);

1 Ответ

2 голосов
/ 08 октября 2010

Мне известны два способа: поиск или саморегистрация . При поиске вы получите все элементы управления в иерархии элементов управления, начиная со страницы, рекурсивно и проверяя, является ли это PermissionPanel.

Второй способ, саморегистрация, который мне нравится, вы обновите PermissionPanel, чтобы зарегистрироваться в списке внутри Page.Items и зарегистрировать свой обработчик проверки только для элементов управления в этом списке.

На PermissionPanel вы можете сделать что-то подобное:

protected override void CreateChildControls()
{
     base.CreateChildControls();

     List <PermissionPanel> panels;

     if (Page.Items["PermissionPanels"] == null)
         Page.Items["PermissionPanels"] = panels = new List <PermissionPanel>();
     else
         panels = Page.Items["PermissionPanels"] as List <PermissionPanel>;

     panels.Add(this);
}

А на странице OnPreRender вы можете выполнить итерацию по Page.Items["PermissionPanels"] и зарегистрировать обработчики проверки в соответствии с вашей группой проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...