WebForms:生成本地资源时避免自动生成用户控件属性
如何阻止自定义控件属性在ASP.NET生成本地资源时被自动添加
在ASP.NET项目中使用自定义用户控件(如wsTextBox)时,执行「Generate Local Resource」操作会自动将控件的自定义属性(如wsEnabled、wsRequired)连同默认值添加到控件标记中,需要手动删除。以下是解决这个问题的具体方案:
核心解决方法:给自定义属性添加[Localizable(false)]特性
ASP.NET的「Generate Local Resource」工具会优先识别带有[Localizable(true)]的属性并纳入资源生成流程,标记为[Localizable(false)]的属性则会被工具直接忽略。你需要将该特性直接添加到公共属性上(而非私有字段),同时修正属性的默认值逻辑:
修改后的控件代码示例:
using System; using System.ComponentModel; using System.Web.UI; using System.Web.UI.WebControls; namespace wsServerControls { [DefaultProperty("Text")] [ToolboxData("<{0}:TextBox runat=server></{0}:TextBox>")] public class wsTextBox : TextBox { // 保留需要本地化的Text属性,明确标记可本地化 [Bindable(true)] [Category("Appearance")] [DefaultValue("")] [Localizable(true)] public override string Text { get => base.Text; set => base.Text = value; } // wsEnabled:标记为不可本地化,修正默认值逻辑 [Category("Behavior")] [DefaultValue(true)] [Localizable(false)] public Boolean wsEnabled { get => ViewState["wsEnabled"] as bool? ?? true; set { ViewState["wsEnabled"] = value; if (!value) { Style.Add("border", "none"); Style.Add("font-family", "Verdana"); Attributes.Add("readonly", "readonly"); Attributes.Add("onfocus", "this.blur();"); TabIndex = -1; } else { Style.Remove("border"); Style.Remove("font-family"); Attributes.Remove("readonly"); Attributes.Remove("onfocus"); } } } // wsRequired:标记为不可本地化 [Category("Behavior")] [DefaultValue(false)] [Localizable(false)] public Boolean wsRequired { get => ViewState["wsRequired"] as bool? ?? false; set => ViewState["wsRequired"] = value; } } }
关键细节说明
- 特性的正确位置:你之前将
Localizable特性错误地加在了私有字段上,这不会生效,必须直接绑定到对应的公共属性。 - 默认值一致性:确保
[DefaultValue]特性的取值和属性get方法中的默认值完全一致,这样当属性使用默认值时,控件标记中不会自动输出该属性(避免生成wsEnabled="False"这类冗余代码)。 - 无效尝试的原因:仅添加
[Browsable(false)]只能让属性在设计器中隐藏,但本地化工具仍会扫描所有公共属性,必须配合[Localizable(false)]才能彻底阻止资源生成时的自动处理。
验证步骤
- 重新编译控件项目并更新引用;
- 在页面中使用
wsTextBox控件,再次执行「Generate Local Resource」操作,此时wsEnabled和wsRequired属性不会被自动添加到控件标记或资源文件中。
内容的提问来源于stack exchange,提问作者Barnsley
相关产品推荐
相关产品推荐

