3

ASPツリービューのチェックボックスを条件付きで無効にするにはどうすればよいですか?

たとえば、アプリケーション ユーザーが特定の権限を持っていない場合は、権限ツリービューでその権限エントリのチェックボックスを無効にします。

これが私が探しているものです。これはwinformアプリで同等のものです(テキストがグレー表示されているチェックボックスは無効になっています):

ここに画像の説明を入力

チェックボックスのクリックイベントが傍受されて無視される他のソリューションを見ました。チェックボックスが単に無効に設定されているソリューションをお勧めします。

C# ソリューションを探していますが、C#/Javascript ソリューションに満足しています。

ありがとう!

4

4 に答える 4

4

わかりました、これに対するかなりきれいな解決策を見つけました:

コードビハインドで:

TreeNode newNode = new TreeNode(permission.ToString());
newNode.SelectAction = TreeNodeSelectAction.None; // no Link

    if (shouldDisableCheckbox)
    {
        // Set a class so disabled nodes can be formatted thru CSS
        // and be identifiable as disabled in Javascript.
        newNode.Text = "<span class=disabledTreeviewNode>" + newNode.Text +"</span>";
    }

nodes.Add (newNode);

Javascript では、すべてのツリービュー ノードをスキャンして、その className を持つものを探し、それらに関連付けられたチェックボックスを無効にします。

    // Called via a startup script created in Code Behind.
    // Disables all treeview checkboxes that have a text with a class=disabledTreeviewNode.
    // treeviewID is the ClientID of the treeView
    function DisableCheckBoxes(treeviewID)
    {
        TREEVIEW_ID = treeviewID;

        var treeView = document.getElementById(TREEVIEW_ID);

        if (treeView)
        {
            var childCheckBoxes = treeView.getElementsByTagName("input");
            for (var i = 0; i < childCheckBoxes.length; i++)
            {
                var textSpan = GetCheckBoxTextSpan(childCheckBoxes[i]);

                if (textSpan.firstChild)
                    if (textSpan.firstChild.className == "disabledTreeviewNode")
                        childCheckBoxes[i].disabled = true;
            }
        }
    }

function GetCheckBoxTextSpan(checkBox)
{
    // Set label text to node name
    var parentDiv = checkBox.parentNode;
    var nodeSpan = parentDiv.getElementsByTagName("span");

    return nodeSpan[0];
}
于 2013-02-26T00:51:57.340 に答える
1

悲しいことに、ずかんたの答えに直接コメントできるほどの評判はありませんが、これは少し面倒ですが、これを機能させるには JavaScript を変更する必要がありました。

if (textSpan.firstChild)
                if (textSpan.className == "disabledTreeviewNode")
                    childCheckBoxes[i].disabled = true;

つまり、textSpan.firstChild.ClassNametextSpan.ClassNameに置き換えます。

また、対処しているツリービュー内のすべてのツリー ノードに

<span></span> 

それらの中で。で null 参照を取得します

if (textSpan.firstChild) 

後続のノードは処理されません。

無効にしたくないすべてのツリー ノードに class=enabledTreeviewNode のスパンを追加することで、この点を回避しました。

JavaScript で例外を処理することもできると思います。

これが、後でこの(そうでなければ優れた)ソリューションに出くわした人に役立つことを願っています.

于 2016-09-05T09:59:27.427 に答える
0

セキュリティ トリミングを使用して、ユーザーがアクセスできないアイテムを表示しないようにすることができます。アイテムを表示するがアクティブにしない方法がわかりません。クライアント側でのみチェックボックスを無効にすると、セキュリティ ホールが作成される可能性があります。

チュートリアル: セキュリティ ロールに基づくサイト マップ ノードのフィルター処理

ASP.NET サイトマップ セキュリティ トリミング

于 2013-02-25T23:38:17.017 に答える