GVKun编程网logo

c# – asp.net UserControl属性(c# user32dll)

17

对于想了解c#–asp.netUserControl属性的读者,本文将是一篇不可错过的文章,我们将详细介绍c#user32dll,并且为您提供关于.net–Masterpage与Usercontrol

对于想了解c# – asp.net UserControl属性的读者,本文将是一篇不可错过的文章,我们将详细介绍c# user32dll,并且为您提供关于.net – Masterpage与Usercontrol与Customcontrol之间的区别、AD域UserAccountControl属性、AD域重要用户属性、Asp.net UserControl LoadControl问题、ASP.NET UserControl 通信的具体实现的有价值信息。

本文目录一览:

c# – asp.net UserControl属性(c# user32dll)

c# – asp.net UserControl属性(c# user32dll)

是否可以访问用户控件中未定义的属性?我想添加任何html属性,而不在codebehind中定义它.

例如:

<my:TextBox runat="server" extraproperty="extravalue" />

在用户控制中未定义的气温,但仍然产生:

<input type="text" extraproperty="extravalue" />

我需要在自定义用户控制.注意我的:在文本框之前.

TY!

解决方法

是的,这是可能的.去尝试一下!

例如,

<asp:TextBox ID="MyTextBox" runat="server" extraproperty="extravalue" />

呈现为:

<input name="...$MyTextBox" type="text" id="..._MyTextBox" extraproperty="extravalue" />

编辑

从评论:

asp:textBox is not a custom user control

以上将适用于自定义服务器控件(从WebControl派生),但不适用于UserControl,因为UserControl没有可以放置该属性的标签:它仅呈现其内容.

因此,您需要在UserControl类中的代码将自定义属性添加到其子控件之一.然后,UserControl可以将自定义属性公开为属性,如:

// Inside the UserControl
public string ExtraProperty
{
    get { return myTextBox.Attributes["extraproperty"]; }
    set { myTextBox.Attributes["extraproperty"] = value; }
}

// Consumers of the UserControl
<my:CustomUserControl ... ExtraProperty="extravalue" />

.net – Masterpage与Usercontrol与Customcontrol之间的区别

.net – Masterpage与Usercontrol与Customcontrol之间的区别

请帮助我理解Master页面与Usercontrol与Custom控件之间的区别

解决方法

在这里检查类似问题的答案:

ASP.Net Custom controls vs. user controls: Are these two the same

母版页实际上是用户控件;您可以通过转到主页类的代码隐藏来验证这一点,右键单击类名并选择“转到定义”.你会看到这样的东西:

public class MasterPage : UserControl
{
    ...
}

用户控件便于显示使用单个项目重复的显示组件,例如菜单和面板.问题是,如果需要,它们不会生成.DLL并且必须手动复制到其他项目.

另一方面,自定义控件可以在单独的类库中创建,并根据需要在其他项目中重用.使用自定义控件时,必须完全在代码中创建显示工件,并且开发需要稍长的时间.

查看Microsoft的用户控件和自定义控件之间的比较:

http://support.microsoft.com/kb/893667

AD域UserAccountControl属性、AD域重要用户属性

AD域UserAccountControl属性、AD域重要用户属性

 

AD域UserAccountControl属性、AD域重要用户属性

    • 1. UserAccountControl属性
    • 2. 重要用户属性

 

1. UserAccountControl属性

因为在修改AD域用户状态的时候发现,一些博客给定的禁用和启用用户的状态值并不一致,参考官网文档和国外的博客发现用户在禁用状态下,也会包含其他属性,这些属性有些是相加的。全量的属性列表如下:

如何参考并使用这个对照表呢?

  • 可以搜索表中关于Disabled的行对应的十进制值,在程序中可以使用作为状态的判断——
    UserAccountControl属性为514546660506608066082里面的值的可以判断为禁用账号;
  • 搜索Enabled,值为54466048262656的以及默认账户类型512可以判断为启用账户;

在开发中,现在的做法是:

self.disabled_user_flag = [514, 546, 66050, 66080, 66082]       # 禁用账户的userAccountControl值列表
self.enabled_user_flag = [512, 544, 66048, 262656]              # 启用账户
...
if en[''attributes''][''userAccountControl''] in self.disabled_user_flag:		# 遍历用户的userAccountControl属性,在self.disabled_user_flag标志列表中的则为禁用账户
	pass
属性标志 十六进制 十进制 非官方值
SCRIPT 0x0001 1  
ACCOUNTDISABLE 0x0002 2  
HOMEDIR_REQUIRED 0x0008 8  
LOCKOUT 0x0010 16  
PASSWD_NOTREQD 0x0020 32  
PASSWD_CANT_CHANGE 0x0040 64  
ENCRYPTED_TEXT_PWD_ALLOWED 0x0080 128  
TEMP_DUPLICATE_ACCOUNT 0x0100 256  
NORMAL_ACCOUNT 默认账户 0x0200 512  
Disabled Account 禁用账户 0x0202 514 x
Enabled, Password Not Required 启用账户 不需密码 0x0220 544 x
Disabled, Password Not Required 禁用账户 不需密码 0x0222 546 x
INTERDOMAIN_TRUST_ACCOUNT 0x0800 2048  
WORKSTATION_TRUST_ACCOUNT 0x1000 4096  
SERVER_TRUST_ACCOUNT 0x2000 8192  
DONT_EXPIRE_PASSWORD 0x10000 65536  
Enabled, Password Doesn’t Expire 启用账户 密码未过期 0x10200 66048 x
Disabled, Password Doesn’t Expire 禁用账户 密码未过期 0x10202 66050 x
Disabled, Password Doesn’t Expire & Not Required 禁用账户 密码未过期且不需密码 0x10220 66080 x
Disabled, Password Doesn’t Expire & Not Required 禁用账户 密码未过期且不需密码 0x10222 66082 x
MNS_LOGON_ACCOUNT 0x20000 131072  
SMARTCARD_REQUIRED 0x40000 262144  
Enabled, Smartcard Required 下面几个都是需要使用智能卡登录账户(我们不涉及) 0x40200 262656 x
Disabled, Smartcard Required 0x40202 262658 x
Disabled, Smartcard Required, Password Not Required 0x40222 262690 x
Disabled, Smartcard Required, Password Doesn’t Expire 0x50202 328194 x
Disabled, Smartcard Required, Password Doesn’t Expire & Not Required 0x50222 328226 x
TRUSTED_FOR_DELEGATION 0x80000 524288  
Domain controller 0x82000 532480  
NOT_DELEGATED 0x100000 1048576  
USE_DES_KEY_ONLY 0x200000 2097152  
DONT_REQ_PREAUTH 0x400000 4194304  
PASSWORD_EXPIRED 0x800000 8388608  
TRUSTED_TO_AUTH_FOR_DELEGATION 0x1000000 16777216  
PARTIAL_SECRETS_ACCOUNT 0x04000000 67108864  

属性说明(可不看):

  • SCRIPT – 将运行登录脚本。
  • ACCOUNTDISABLE – 用户帐户已禁用。
  • HOMEDIR_REQUIRED – 主文件夹是必需的。
  • PASSWD_NOTREQD – 不需要密码。
  • PASSWD_CANT_CHANGE – 用户无法更改密码。这是对用户对象的权限。 有关如何以编程方式设置此权限的信息,请访问以下网站:Modifying User Cannot Change Password (LDAP Provider)
  • ENCRYPTED_TEXT_PASSWORD_ALLOWED – 用户可以发送加密的密码。
  • TEMP_DUPLICATE_ACCOUNT – 这是其主要帐户位于另一个域中的用户的帐户。该帐户为用户提供对该域的访问权限,但不提供对任何信任该域的域的访问权限。有时称为本地用户帐户。
  • NORMAL_ACCOUNT – 这是代表典型用户的默认帐户类型。
  • INTERDOMAIN_TRUST_ACCOUNT – 这是允许信任信任其他域的系统域的帐户的许可。
  • WORKSTATION_TRUST_ACCOUNT – 这是运行Microsoft Windows NT 4.0工作站,Microsoft Windows NT 4.0 Server,Microsoft Windows 2000 Professional或Windows 2000 Server的计算机的计算机帐户,并且是此域的成员。
  • SERVER_TRUST_ACCOUNT – 这是域控制器的计算机帐户,该域控制器是该域的成员。
  • DONT_EXPIRE_PASSWD – 表示密码,该密码永远不会在该帐户上过期。
  • MNS_LOGON_ACCOUNT – 这是MNS登录帐户。
  • SMARTCARD_REQUIRED – 设置此标志后,它将强制用户使用智能卡登录。
  • TRUSTED_FOR_DELEGATION – 设置此标志后,将为Kerberos委派信任运行该服务的服务帐户(用户或计算机帐户)。任何此类服务都可以模拟请求该服务的客户端。要为Kerberos委派启用服务,必须在服务帐户的userAccountControl属性上设置此标志。
  • NOT_DELEGATED – 设置此标志时,即使将服务帐户设置为受Kerberos委派的信任,也不会将用户的安全上下文委派给服务。
  • USE_DES_KEY_ONLY – (Windows 2000 / Windows Server 2003)将此主体限制为仅对密钥使用数据加密标准(DES)加密类型。
  • DONT_REQUIRE_PREAUTH – (Windows 2000 / Windows Server 2003)此帐户登录时不需要Kerberos预身份验证。
  • PASSWORD_EXPIRED – (Windows 2000 / Windows Server 2003)用户密码已过期。
  • TRUSTED_TO_AUTH_FOR_DELEGATION –(Windows 2000 / Windows Server 2003)帐户已启用委派。这是对安全性敏感的设置。启用此选项的帐户应受到严格控制。使用此设置,可以在帐户下运行的服务采用客户端的身份,并以该用户身份向网络上的其他远程服务器进行身份验证。
  • PARTIAL_SECRETS_ACCOUNT – (Windows Server 2008 / Windows Server 2008 R2)该帐户是只读域控制器(RODC)。这是对安全性敏感的设置。从RODC删除此设置会损害该服务器上的安全性。

2. 重要用户属性

AD域中的字段 含义 示例 说明
objectGUID 对象的唯一标识符 24699359-f8c2-482a-a3d6-e5557c31bd19 无需用户修改
sAMAccountName SAM账号 P009527 登录账号
distinguishedName 对象dn CN=李四9527,OU=研发支持,OU=上海总部,OU=XXX,OU=COM 对象在AD域中的位置
pwdLastSet 用户下次登录必须修改密码 0 默认不设置,需要强制其修改则设置为0
accountExpires 账户过期时间 0 设置为0永不过期,否则设置为NT时间
whenCreated 对象创建时间 2020-10-09 09:17:49+00:00 用于表示日期和时间的国际标准是ISO8601。其完整参考编号是ISO 8601:1988(E),其标题是“数据元素和交换格式-信息交换-日期和时间的表示”。
whenChanged 对象修改时间 2020-10-09 09:17:50+00:00  
displayname 显示名 李四  
sn  
givenName  
mail 电子邮件 si.li@XXX.com  
mobile 移动电话 15002510721,13341667654  
telephoneNumber 电话号码 051632423534  
company 公司 小米  
department 部门 研发支持  
title 职务 技术顾问  

accountExpires
如果您在AD中设置了一个帐户,该帐户于2020年10月15日下午5:00到期,则该帐户在AD中有效的最后一天是7月14日。
如果使用Microsoft管理控制台将帐户设置为在2020年10月15日到期,则“登录到期时间”的accountExpires属性设置为在2020年10月16日上午12:00到期,因为Microsoft管理控制台不允许使用要设置的时间值,默认值为12:00 am

在AD中将accountExpires的值设置为“ -1”将导致eDirectory设置为:2106年2月7日,美国东部标准时间(2860207062815Z)1:28:15。

**accountExpires**字段在创建用户的时候可以给定限制,假设当前时间是2020年11月23日,我们给这个用户三个月的有限期,则有如下`python`代码:

def   current_time2nt_time_plus_mouths ( M ):
     import  time
     import  datetime
     from  dateutil.relativedelta  import  relativedelta
     ''''''当前时间加一个时间差并转换为NT时间
    ''''''
    now = datetime.datetime.now()                # 当前时间
    now += relativedelta( months =M)               # 当前时间加上时间差
    timestamp = time.mktime(now.timetuple())
    timestamp *=  1000
    timestamp -=  57599875
    timestamp *=  10000
    timestamp +=  116445312000000000
    timestamp =  '' %d ''  % timestamp
     return  timestamp
 
if   __name__  ==  "__main__" :
    ts = current_time2nt_time_plus_mouths( 3 )
     print (ts)

最后的ts假设为:

`132585363281250000` 

则为三个月后的此刻过期。

代码直接修改一个用户的过期时间字段为:

modify()方法中第一个参数为用户dn,第二个参数为待修改的内容:{''待修改字段'': (2, [值])},2的意思是修改;con = con_ad()是AD服务器的连接,这里不写了。

# con = con_ad()
# modify_res = con.modify("CN=xxx,OU=xxx,OU=xxx,OU=xxx,DC=xxx,DC=com", {
#     ''accountExpires'': (2, [ts])})
# print(modify_res)

Asp.net UserControl LoadControl问题

Asp.net UserControl LoadControl问题

使用LoadControl(type,Params)时,我遇到了一个问题.让我解释…

我有一个超简单的用户控制(ascx)

<%@ Control Language="C#" AutoEventWireup="True" Inherits="Errordisplay" Codebehind="Errordisplay.ascx.cs" EnableViewState="false" %>

<asp:Label runat="server" ID="lblTitle" />
<asp:Label runat="server" ID="lblDescription" />

与代码(c#)后面:

public partial class Errordisplay : System.Web.UI.UserControl
{

    private Message _ErrorMessage;    

    public Errordisplay()
    {
    }

    public Errordisplay(Message ErrorMessage)
    {
        _ErrorMessage = ErrorMessage;
    }    

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

        if (_ErrorMessage != null)
        {
            lblTitle.Text = _ErrorMessage.Message;
            lblDescription.Text = _ErrorMessage.Description;
        }
    }
}

在我的Web应用程序的其他地方,我将使用以下代码向用户控件添加一个实例:

divValidationIssues.Controls.Add(LoadControl(typeof(Errordisplay),new object[] { MessageDetails }));

我正在使用LoadControl的重载版本,因为我想将Message参数传递给构造函数.所有这一切似乎都可以正常工作.

但是,当在Errordisplay用户控件上触发OnPreRender()时,lblTitle和lblDescription变量都为空,尽管它们具有等价的标记.消息变量已正确填充.

任何人都可以说明为什么会发生这种情况吗?

谢谢

编辑:

为了清楚起见,我还会补充说,正在编程地将用户控件添加到页面的代码正在响应按钮按钮,所以“主机页面”已经通过Init,Page_Load进行,现在正在处理事件处理程序.

我们无法在早期的asp生命周期阶段添加用户控件,因为它们是响应于按钮单击事件而创建的.

解决方法

我也尝试了以下代码 – 它产生相同的结果(即lblTitle和lblDescription都为null)
protected void Page_Load(object sender,EventArgs e)
{
    if (_ErrorMessage != null)
    {
        lblTitle.Text = _ErrorMessage.Message;
        lblDescription.Text = _ErrorMessage.Description;
    }
}

我了解到,LoadControl函数将控件加载到正在包含的页面的当前“状态”中.因此,Init,Page_Load等都作为LoadControl调用的一部分运行.

有趣的是,这个(未回答)asp.net论坛的帖子展现了与我遇到的相同的问题.

MSDN Forums Post

另外 – 从MSDN:

When you load a control into a container control,the container raises all of the added control’s events until it has caught up to the current event. However,the added control does not catch up with postback data processing. For an added control to participate in postback data processing,including validation,the control must be added in the Init event rather than in the Load event.

所以不要LoadControl正确的控制?

编辑:

好的,所以我在这里回答我自己的问题

我找到一个回复​​版本的论坛帖子,我链接到Here上面

基本上,答案是LoadControl(type,params)不能推断“页面前端”ascx来解析,因此它不会打扰任何控件.当您使用LoadControl(“ascx路径”)版本时,它被赋予页面前端,因此执行所有解析和初始化.

总而言之,我需要更改正在控制的代码,并将其拆分成单独的部分.即

Control ErrorCntrl = LoadControl("Errordisplay.ascx");
ErrorCntrl.ID = SomeID;
(ErrorCntrl as Errordisplay).SetErrorMessage = MessageDetail;
diverrorContainer.Controls.Add(ErrorCntrl);

它应该工作正常..它不像我以前的尝试一样整洁,但至少它会工作.

我仍然乐意提出上述建议.

干杯

ASP.NET UserControl 通信的具体实现

ASP.NET UserControl 通信的具体实现

最近在SharePoint2007中用到了WebPart通信技术,个人觉得2007版本里面的ConnectionConsumer和ConnectionProvider没有2010版本那么好用,于是换了一种思想去实现通信:WebPart容器中装一个UserControl控件,这样只要UserControl可以通信,就实现了WebPart之间通信。

UserControl是用户自定义控件,我们可以在UserControl中注入事件,当一个UserControl触发某种事件,然后通过事件参数来传递数据,让其他UserControl获得这个事件传递过来的参数,实现通信。

下面简单演示一下两个UserControl进行通信

 

创建好一个类,两个UserControl和一个web页面。

这里分别是MyEventAgrs.cs,UCProvider.ascx,UCComsumer.ascx,Default.aspx。

MyEventAgrs.cs代码如下:

复制代码 代码如下:

public delegate void MyEventHandle(object sender, MyEventAgrs args);
    public class MyEventAgrs : EventArgs
    {
        public MyEventAgrs() { }
        public string MyMsg { get; set; }
    }

public delegate void MyEventHandle(object sender, MyEventAgrs args);
    public class MyEventAgrs : EventArgs
    {
        public MyEventAgrs() { }
        public string MyMsg { get; set; }
    }


如果想传递其他对象时就只需要修改MyEventAgrs类的MyMsg方法。这里须继承EventArgs抽象类,用于存放事件参数值,另外需定义一个委托事件,然后在其他的地方使用。

 UCProvider.ascx代码如下:

复制代码 代码如下:

 public partial class UCProvider : System.Web.UI.UserControl
    {
        public event MyEventHandle myHandle;
        protected void Page_Load(object sender, EventArgs e)
        {
            this.DropDownList1.SelectedIndexChanged += new EventHandler(DropDownList1_SelectedIndexChanged);
        }
        void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            MyEventAgrs myEvent = new MyEventAgrs();
            myEvent.MyMsg = DropDownList1.SelectedValue;
            myHandle(this, myEvent);
        }    }

public partial class UCProvider : System.Web.UI.UserControl
    {
        public event MyEventHandle myHandle;
        protected void Page_Load(object sender, EventArgs e)
        {
            this.DropDownList1.SelectedIndexChanged += new EventHandler(DropDownList1_SelectedIndexChanged);
        }
        void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            MyEventAgrs myEvent = new MyEventAgrs();
            myEvent.MyMsg = DropDownList1.SelectedValue;
            myHandle(this, myEvent);
        }    }


这里在前台页面中定义了一个DropDownList,并给DropDownList绑定了数据源,不再罗列前台页面。我想实现当用户选择DropDownList的时候将用户选择的DropDownList的值传递出去,代码里面用myHandle(this, myEvent)来初始化事件。

UCComsumer.ascx代码如下:

复制代码 代码如下:

 public partial class UCComsumer : System.Web.UI.UserControl
    {
public void InitValue(string msg) {
            lb.Text = msg;
        }
}

public partial class UCComsumer : System.Web.UI.UserControl
    {
public void InitValue(string msg) {
            lb.Text = msg;
        }
}


这里赋值的时候也可以用属性来表示,比如:
复制代码 代码如下:

  public string UC1Msg
        {
            get{return this.lb.Text;}
            set{this.lb.Text=value;}
        }

public string UC1Msg
        {
            get{return this.lb.Text;}
            set{this.lb.Text=value;}
        }


如果用这种方式,在引用UserControl的时候就更加方便了:
复制代码 代码如下:

<uc2:ucConsumer runat="server" ID="uc2" UC1Msg="Defalut Value" />

<uc2:ucConsumer runat="server" ID="uc2" UC1Msg="Defalut Value" />


Default.aspx代码如下:

前台页面里面需要注册UserControl

复制代码 代码如下:

<%@ Register TagPrefix="uc1" TagName="ucProvider" Src="~/UserControls/UCProvider.ascx" %>
<%@ Register TagPrefix="uc2" TagName="ucConsumer" Src="~/UserControls/UCComsumer.ascx" %>

<%@ Register TagPrefix="uc1" TagName="ucProvider" Src="~/UserControls/UCProvider.ascx" %>
<%@ Register TagPrefix="uc2" TagName="ucConsumer" Src="~/UserControls/UCComsumer.ascx" %>


再引用

复制代码 代码如下:

<uc1:ucProvider runat="server" ID="uc1" OnmyHandle="uc1_myHandle" />
<uc2:ucConsumer runat="server" ID="uc2" />

<uc1:ucProvider runat="server" ID="uc1" OnmyHandle="uc1_myHandle" />
<uc2:ucConsumer runat="server" ID="uc2" />


后台页面:
复制代码 代码如下:

protected void uc1_myHandle(object sender, MyEventAgrs args)
        {
            if (args != null)
            {
                uc2.InitValue(args.MyMsg);
            }
            else
                uc2.UC1Msg = string.Empty;
        }

protected void uc1_myHandle(object sender, MyEventAgrs args)
        {
            if (args != null)
            {
                uc2.InitValue(args.MyMsg);
            }
            else
                uc2.UC1Msg = string.Empty;
        }


这样就完成了整个过程。Default.aspx页面仅仅是一个载体或者是中间介质,所有的操作都是在两个UserControl之间进行。但是当页面第一次加载的时候,也就是页面加载好过分下拉框没有被点击之前,这里是没有值传递的。

我们今天的关于c# – asp.net UserControl属性c# user32dll的分享已经告一段落,感谢您的关注,如果您想了解更多关于.net – Masterpage与Usercontrol与Customcontrol之间的区别、AD域UserAccountControl属性、AD域重要用户属性、Asp.net UserControl LoadControl问题、ASP.NET UserControl 通信的具体实现的相关信息,请在本站查询。

本文标签: