1

これは長々と続きますが、知識のあるチャップの 1 人がトレーニングするのは簡単なはずです。

動的ログイン リンクを含む DotNetNuke Web ページがあります。ログインしていない場合、リンクは「ログイン」となり、ログイン ポップアップへの適切な URL が表示されます。ログインしている場合、リンクは「ログアウト」になり、同様に、ログアウトを処理する Web ページへの適切な URL があります。

ログインしているかどうかをページが判断すると、onclick="return dnnModal.show('http://blahblah.com....') の属性で HTML リンクが作成されます。

これを行うコード:

 loginLink.Attributes.Add(" onclick", "return " + UrlUtils.PopUpUrl(loginLink.NavigateUrl, this, PortalSettings, true, false, 200, 550));

リンクが何であれ、ID とクラスは常に同じままです。私の問題は、ログインテキストを画像に置き換えたいということです。実際には、ログインとログアウト用に別の画像を使用しています。ここでの問題は、ID とクラスが同じままであるため、通常のように CSS を介して行うことはできませんが、属性に基づいてクラスのスタイルを設定できたことです。HTML リンクの作成の出力を見つけて、たとえば「href」属性に基づいてクラスをスタイリングすることで、これをテストしました。

a #dnn_dnnLogin_loginLink .LoginLink [href="http://some very very long dynamically created URL.aspx"]{ styles here }

これに関する問題は、現在表示しているページに基づいてログイン/ログアウト リンクが変わることです。

レンダリングされた 2 つのオプションのそれぞれに、スタイルを設定できる固有の属性があり、それが「テキスト」属性であることは知っています。では、この属性を追加して HTML でレンダリングし、CSS でスタイルを設定できるようにするにはどうすればよいでしょうか?

次のようないくつかのバリエーションを試しました。

loginLink.Attributes.Add(" onclick", "return " + UrlUtils.PopUpUrl(loginLink.NavigateUrl, this, PortalSettings, true, false, 200, 550) " Text", + loginLink.Text);

レンダリングされるものが次のようになることを期待して:

onclick="return dnnModal.show('http://localhost/CPD/tabid/87/ctl/Login/Default.aspx?returnurl=%2fCPD.aspx&popUp=true',/*showReturn*/true,200,550,true,'')" Text="Login"

だから私はスタイルを整えることができました:

a #dnn_dnnLogin_loginLink .LoginLink [Text="Login"]{styles here}
a #dnn_dnnLogin_loginLink .LoginLink [Text="Logout"]{styles here}

しかし、代わりに一般的なエラーが発生します。行を書くさまざまな方法を試しましたが、成功しませんでした。構文がわかりません。

誰かが私を正しい方向に向けることができますか? これが私の最初の問題に対する本当に簡単な解決策になるので、間違ったツリーを吠えていないことを願っています。

ありがとう、

編集 - ページ全体のコードが役立つ場合は?

    using System;
using System.Web;
using System.Web.UI;
using DotNetNuke.Common;
using DotNetNuke.Common.Utilities;
using DotNetNuke.Services.Exceptions;
using DotNetNuke.Services.Localization;
using DotNetNuke.UI.Modules;

namespace DotNetNuke.UI.Skins.Controls
{
public partial class Login : SkinObjectBase
{

    private const string MyFileName = "Login.ascx";

    public string Text { get; set; }

    public string CssClass { get; set; }

    public string LogoffText { get; set; }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        try
        {
            if (!String.IsNullOrEmpty(CssClass))
            {
                loginLink.CssClass = CssClass;
            }

            if (Request.IsAuthenticated)
            {
                if (!String.IsNullOrEmpty(LogoffText))
                {
                    if (LogoffText.IndexOf("src=") != -1)
                    {
                        LogoffText = LogoffText.Replace("src=\"", "src=\"" + PortalSettings.ActiveTab.SkinPath);
                    }
                    loginLink.Text = LogoffText;
                }
                else
                {
                    loginLink.Text = Localization.GetString("Logout", Localization.GetResourceFile(this, MyFileName));
                }
                loginLink.NavigateUrl = Globals.NavigateURL(PortalSettings.ActiveTab.TabID, "Logoff");
            }
            else
            {
                if (!String.IsNullOrEmpty(Text))
                {
                    if (Text.IndexOf("src=") != -1)
                    {
                        Text = Text.Replace("src=\"", "src=\"" + PortalSettings.ActiveTab.SkinPath);
                    }
                    loginLink.Text = Text;
                }
                else
                {
                    loginLink.Text = Localization.GetString("Login", Localization.GetResourceFile(this, MyFileName));
                }

                string returnUrl = HttpContext.Current.Request.RawUrl;
                if (returnUrl.IndexOf("?returnurl=") != -1)
                {
                    returnUrl = returnUrl.Substring(0, returnUrl.IndexOf("?returnurl="));
                }
                returnUrl = HttpUtility.UrlEncode(returnUrl);

                loginLink.NavigateUrl = Globals.LoginURL(returnUrl, (Request.QueryString["override"] != null));

                if (PortalSettings.EnablePopUps && PortalSettings.LoginTabId == Null.NullInteger)
                {
                    loginLink.Attributes.Add(" onclick", "return " + UrlUtils.PopUpUrl(loginLink.NavigateUrl, this, PortalSettings, true, false, 200, 550));
                }
            }
        }
        catch (Exception exc)
        {
            Exceptions.ProcessModuleLoadException(this, exc);
        }
    }

}
}
4

2 に答える 2

1

CSS クラスはまさにこの目的のために設計されており、CSS スタイリングを使用するすべてのブラウザー (非常に古いものも含む) でサポートされています。スタイリングを変更して再び壊す可能性のあるリンクを参照しているあいまいなセレクターと戦う必要はありません。

これらのタグに割り当てられたクラスが既にあると言ったので、追加のクラスを指定したいだけです。タグに複数のクラスを割り当てることができます。詳細については、W3C css クラス ページの「属性値」セクションを参照してください。

要素の 1 つ以上のクラス名を指定します。複数のクラスを指定するには、クラス名をスペースで区切ります (例: . これにより、1 つの HTML 要素に対して複数の CSS クラスを組み合わせることができます。

WebControl.CssClassスペースで区切って文字列に追加するだけで、2 番目のクラスを設定できます。

loginLink.CssClass = loginLink.CssClass + " login";

また

loginLink.CssClass = loginLink.CssClass + " logout";

この方法で、CSS スタイル シートの単一のクラス セレクターまたは複数のクラス セレクター (両方のクラスが割り当てられているタグのみを選択) を介してアクセスできます。

.LoginLink.login { /* styles here */ }
.LoginLink.logout { /* styles here */ }
于 2012-05-24T09:21:56.687 に答える
0

ログイン/ログアウト ボタンのテキストは、Text="" 属性ではなく、InnerHTML ノードに格納されます。したがって、CSS セレクターは適用されません。(また、セレクターの間隔が間違っていると思います。このソリューションでは、多言語ボタンなどはサポートされません。)

通常、このタイプのスタイリングは、Skin Editor (Admin/Skins/Skin Designer セクションまでスクロールダウン) で実装されます。ここで、Skin または Container、File、Token=LOGIN、Setting=Text、および LogoffText を選択し、値 src を追加します。 =path/to/a.gif. ただし、スキン デザイナーは 6.1.x で壊れているようです (バグ レポート) 。

DNN インストールの admin\Skins ディレクトリにある login.ascx および login.ascx.cs ファイルを確認してみてください。コードを編集して、Request.IsAuthenticated に応じて loginLink.ImageUrl を割り当てます。

于 2012-05-24T09:23:06.553 に答える