繁体   English   中英

使用C#通过attribute.add创建多个HTML属性的语法

[英]Syntax for using C# to create multiple HTML attributes via attributes.add

这是一个漫长的过程,但对于其中一个熟悉的小伙子来说,锻炼起来应该很容易。

我有一个带有动态登录链接的DotNetNuke网页。 如果您未登录,则链接将为“登录”,并具有指向登录弹出窗口的相应URL。 如果您已登录,则链接将是“注销”,并且同样具有用于处理注销的网页的相应URL。

当页面确定您是否已登录时,将使用以下属性建立HTML链接:onclick =“ return dnnModal.show('http://blahblah.com ....')。

执行此操作的代码:

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

无论链接是什么,ID和Class始终保持相同。 我的问题是我想用一个图像替换登录文本,在另一个图像上进行登录和注销。 这里的问题是,因为ID和Class保持不变,所以我不能像往常一样通过CSS进行操作,但是我已经能够根据类的属性来设置类的样式。 我已经通过找出HTML链接创建的输出并基于'href'属性对类进行样式化来进行了测试,例如:

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

问题在于登录/注销链接会根据您当前所在的页面而变化。

我确实知道,这两个呈现选项中的每个选项都有一个我可以设置样式的唯一属性,这就是它们的“文本”属性。 因此,非常简单地如何添加此属性以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);
        }
    }

}
}

CSS类就是为此目的而设计的,并且所有使用CSS样式的浏览器(甚至是很老的样式)都支持它们。 您不必使用晦涩的选择器来解决问题,这些选择器引用了可能会更改并再次破坏样式的某些链接。

由于您说您已经为这些标签分配了一个类,因此您只想指定一个附加的类。 您可以将多个类分配给一个标签。 请参阅W3C CSS类页面以获取更多信息,请参见“属性值”部分:

为一个元素指定一个或多个类名。 要指定多个类,请用空格分隔类名,例如。 这使您可以为一个HTML元素组合多个CSS类。

您可以通过将第二个类附加到以空格分隔的WebControl.CssClass字符串来设置它:

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

要么

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

这样,您可以通过CSS样式表中的单个类选择器甚至多个类选择器(仅选择同时分配了两个类的那些标签)进行访问:

.LoginLink.login { /* styles here */ }
.LoginLink.logout { /* styles here */ }

登录/注销按钮上的文本未存储在Text =“”属性中,而是存储在InnerHTML节点中。 因此,您的CSS选择器将不适用。 (我还认为选择器中的间距是错误的,并且该解决方案将不支持多语言按钮等。)

通常,这种类型的样式将在“皮肤编辑器”(管理员/皮肤/向下滚动到“皮肤设计器”部分)中实现,在其中选择“皮肤”或“容器”,“文件”,“令牌” =“登录”,“设置” =“文本”和“ LogoffText”,并添加值src = path / to / a.gif。 但是,皮肤设计器似乎已在6.1.x中被破坏( 错误报告

您仍然可以尝试查看DNN安装目录admin \\ Skins目录中的login.ascx和login.ascx.cs文件。 编辑代码,以根据Request.IsAuthenticated分配loginLink.ImageUrl。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM