使用文本模式密码的文本框在ASP.NET C#中不显示文本

27

我在网页表单上放置了几个按钮,用户点击它们后将更新文本框。这个功能之前都能正常运行,但是当我添加textmode=password时就出现问题了。现在文本框不再显示文本。我调试了应用程序,发现text属性确实得到了值,但是仍然没有显示。

以下是我尝试过的方法:

 protected void btn_punch_7_Click(object sender, EventArgs e)
    {

        const string string_punch_Number_7 = "7";
        var text = txt_punch.Text;
        text += string_punch_Number_7;

        txt_punch.Text = text;


    }

    protected void btn_punch_8_Click(object sender, EventArgs e)
    {
        const string string_punch_Number_8 = "8";
        var text = txt_punch.Text;
        text += string_punch_Number_8;

        txt_punch.Text = text;

    }

我也尝试过这个:

public partial class WebForm3 : System.Web.UI.Page
{
    public string string_punch;
    protected void Page_Load(object sender, EventArgs e)
    {
        MultiView1.SetActiveView(View1);

        txt_punch.Width = 300;
        txt_punch.Height = 50;
        txt_punch.MaxLength = 4;
        txt_punch.Attributes.Add("OnChange", string_punch);

    }

    protected void btn_punch_7_Click(object sender, EventArgs e)
    {

        const string string_punch_Number_7 = "7";
        string_punch = txt_punch.Text;
        string_punch += string_punch_Number_7;

        txt_punch.Text = string_punch;


    }

    protected void btn_punch_8_Click(object sender, EventArgs e)
    {
        const string string_punch_Number_8 = "8";
        string_punch = txt_punch.Text;
        string_punch += string_punch_Number_8;

        txt_punch.Text = string_punch;

    }

不应该强制在密码字段上显示文本。如果您强制显示文本,则任何人都可以通过查看您网站的HTML来获取密码。 - bastos.sergio
@bastos.sergio 这有多大的问题?HTML 不会被存储在任何地方。除非输入密码的人在提交之前将页面保存到磁盘上。 - Mr Lister
不需要存储...尝试这个,右键单击网站上的任何位置,然后选择“查看源代码”选项。这就是您查看HTML所需的全部内容... - bastos.sergio
当然可以,但前提是输入密码的人在提交之前离开了。我认为风险不是很大。 - Mr Lister
你输入的内容不会被存储在HTML中(而是存储在内存中)。如果您通过代码后台设置密码,如下面的示例所示,您将在HTML中看到它。请记住,像Facebook、Hotmail等网站从不在您要求更改密码时加载您的原始密码,这是有原因的。一旦您通过类似于* TextBos.Attributes.Add("value", "yourPassword"); *的属性设置密码,您就会让您的网站对黑客敞开大门。 - bastos.sergio
显示剩余2条评论
7个回答

64

你有多绝望?

如果你不够绝望,不愿意试图尝试任何办法来让它工作,请停止阅读。这将不会很好。好吗?好。

诀窍是让Web应用程序认为它不是一个密码框。换句话说,不要使用TextMode="password"
然后在Page_Load中,加上txt_punch.Attributes["type"] = "password"

就是这样。浏览器会知道它是一个密码字段(并显示星号或点),但服务器端不会知道,因此它会将内容发送到客户端,就像它是纯文本一样。当然,这也会将密码放在页面源代码中...


我不是那么确定我是那么绝望,哈哈。在发布问题之前,我已经考虑过这个问题了。我真的想在代码后台或安全性方面解决这个问题。但如果其他方法都失败了,谢谢你的建议。 - nate
绝对容易,但是在我看到这个之后 :) - Subrata Sarkar
这是一个非常好的解决方案,特别是如果您需要检查文本是否已更改。使用“TextBox.Attributes.Add(“value”,“yourPassword”);”会触发您的onTextChanged事件。太棒了。 - djfranzwa
这个有效,谢谢。只是这个(就像微软)有问题啊,密码类型的意义在哪里呢?如果使用不正确,在更新时会将密码重置为空白... - visual
@visual 它会将密码变成空白,因为:1)否则需要再次通过网络发送密码,这是一种安全风险;2)如我所说,密码最终以明文形式出现在页面源代码中(以及计算机硬盘上的浏览器缓存中),这是一种安全风险;3)屏幕上显示为●●●●●●●,用户无法看到是否有输入错误,他们仍然需要重新输入;4)不仅是微软,所有人都是这样做的。 - Mr Lister
@MrLister,感谢您的解释,很有道理。我想最好的逻辑是,如果按下更新按钮且密码字段值为空,则不进行更新或显示“验证”消息,“需要密码”以进行更新。 - visual

15

当你将TextBox的TextMode属性设置为Password时,默认行为是不显示Text属性的值。

这是为了防止未屏蔽的密码在页面的HTML源代码中显示。

一种解决方案是使用一个属性来保存密码值:

TextBox.Attributes.Add("value", "yourPassword");

来源


@nate - 抱歉没注意到,不知道还有什么建议。 - ChrisF
@nate 我没看到你尝试过那个。不过我想出了一个替代方案... - Mr Lister
你是指给文本框添加一个属性 onchange="78" 的那个吗? - Mr Lister
еңЁPage_LoadдёӯдҪҝз”ЁtextBox.Attributes["value"] = "password";иҖҢдёҚжҳҜtextBox.Text = "password";пјҢж•ҲжһңеҫҲеҘҪгҖӮ - ygoe
3
工作时间不长。每次回发内容都会丢失。那个东西坏了。必须使用 <asp:TextBox type="password"/> 代替 <asp:TextBox TextMode="Password"/>。然后可以正常使用 Text 属性。 - ygoe

1

根据Kola答案中的第一种选项,您可以尝试以下方法:

TextBox.Attributes["value"] = "Whatever value goes here";

1

当您将文字框的属性设置为TextMode="Password"时,在编辑模式下,文本框显示为空白。如果您填写值,例如:

TextBox.Text = "Password";

然后不起作用,您需要再次输入密码以保存表单。 您可以使用属性在文本框中填充值,如下面的代码。

TextBox.Attributes["value"] = "your password value";

0
这是一个 asp.net 的 BUG!! 电子邮件验证算法非常严格,导致一些有效的电子邮件被排除在外。如果您将 TextMode 从“Password”切换到“SingleLine”,您的代码就可以工作了。

错误的答案!!! - T.S.

0

我们不能直接给密码文本框赋值。 要给文本框密码赋值,我们应该使用文本框属性。

Textbox1.Attributes.Add("value",variable/"string");

-1

密码通常不应该显示,但如果您打算这样做,此页面可能会帮助您解决方案


7
仅提供链接的答案并不是好的答案。您能在这里包含答案的要点吗? - ChrisF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接