You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)]才能彻底阻止资源生成时的自动处理。

验证步骤

  1. 重新编译控件项目并更新引用;
  2. 在页面中使用wsTextBox控件,再次执行「Generate Local Resource」操作,此时wsEnabled和wsRequired属性不会被自动添加到控件标记或资源文件中。

内容的提问来源于stack exchange,提问作者Barnsley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 09:25:11