2010-01-30 52 views
9

Tôi có một textbox asp.net như thế này:ASP: TextBox Giá trị biến mất trong postback chỉ khi mật khẩu

<asp:TextBox ID="PINPad" runat="server" Columns="6" MaxLength="4" 
     CssClass="PINTextClass"></asp:TextBox> 

Đó là, như bạn có thể đoán, các văn bản hộp từ trên màn hình PIN pad. Javascript điền vào các giá trị. Trang được đăng lại sau mỗi năm giây (sử dụng bảng cập nhật nếu có vấn đề) để cập nhật các mục không liên quan khác trên màn hình. Điều này hoạt động tốt.

Tuy nhiên, khi tôi chuyển nó sang một hộp văn bản mật khẩu, như thế này:

<asp:TextBox ID="PINPad" runat="server" Columns="6" MaxLength="4" 
     CssClass="PINTextClass" TextMode="Password"></asp:TextBox> 

Sau đó, bất cứ khi nào bài đăng của trang trở lại, hộp văn bản sẽ bị xóa ra trên màn hình và hộp rỗng (mặc dù trong các sự kiện hẹn giờ, giá trị không làm cho nó trở lại máy chủ.)

Bất kỳ đề xuất làm thế nào để sửa lỗi này, để nó giữ lại giá trị của nó trong khi postback?

+3

Có bài viết về cách giải quyết này một cách an toàn hơn (nếu không nói là hoàn hảo) tại http://www.codeproject.com/Articles/18927/How-to-safely-keep-a-password- trường-trong-postbac – Mark

Trả lời

15

Là một tính năng bảo mật, ASP.NET cố gắng không cho phép bạn gửi lại giá trị mật khẩu cho khách hàng. Nếu bạn không hài lòng với các vấn đề bảo mật (tức là thông tin không thực sự an toàn hoặc bạn chắc chắn rằng kết nối được bảo mật), bạn có thể đặt thuộc tính "value" của điều khiển theo cách thủ công, thay vì sử dụng thuộc tính Text. Nó có thể giống như thế này:

this.PINPad.Attributes.Add("value", this.PINPad.Text); 
0

đây là một cách khác để làm điều đó: -

using System; 
using System.Text; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace WebControlLibrary 
{ 
    public class PWDTextBox : TextBox 
    { 
     public PWDTextBox() 
     { 
      this.TextMode = TextBoxMode.Password; 
     } 

     public string Password 
     { 
      get 
      { 
       string val = (string)ViewState["pwd"]; 
       if (string.IsNullOrEmpty(val)) 
       { 
        return ""; 
       } 
       else 
       { 
        return val; 
       } 
      } 
      set 
      { 
       ViewState["pwd"] = value; 
      } 
     } 

     public override string Text 
     { 
      get 
      { 
       return Password; 
      } 
      set 
      { 
       Password = value; 
      } 
     } 

     protected override void OnPreRender(EventArgs e) 
     { 
      base.OnPreRender(e); 
      this.Text = Password; 
     } 

     protected override void AddAttributesToRender(HtmlTextWriter writer) 
     { 
      base.AddAttributesToRender(writer); 
      writer.AddAttribute(HtmlTextWriterAttribute.Value, this.Password); 
     } 
    } 
} 
0

Vấn đề mất mật khẩu trong postback có thể tránh việc sử dụng của Asynchronous JavaScript cuộc gọi, cho phép mô tả một kịch bản điển hình cho một trang Login:

phép nói rằng chúng tôi có một trang đăng nhập cho phép người dùng thay đổi ngôn ngữ của nhãn của nó khi người dùng chọn một ngôn ngữ với một DropDownList

enter image description here

một giải pháp sẽ được gọi SelectedIndexChanged sự kiện của DropDownList, làm một postback mà đi đến máy chủ và chọn lên các nhãn trong ngôn ngữ đã chọn.

trong trường hợp này, mật khẩu trường sẽ bị mất do tính năng bảo mật của ASP.NET làm cho các trường mật khẩu không được duy trì giữa một lần đăng lại.

Kịch bản này có thể được giải quyết nếu việc postback tránh sử dụng công nghệ JavaScript không đồng bộ và XML (Ajax).

Thêm một hàm javascript mà sẽ được gọi từ sự kiểm soát DropDownList, trong trường hợp này chức năng này được gán cho tài sản của DropDownList lệnh trong mã đằng sau:

function ValueChanged(div) 
      { 
       var table = div.getElementsByTagName("table"); 
       if (table && table.length > 0) 
       { 
        var t = table[0].getAttribute('type'); 
        if (t != null && (t == "DropDown")) 
        { 
         var inputs = div.getElementsByTagName("input"); 
         if (inputs && inputs.length == 2) 
         { 

          { 
           Translate(inputs[1].value); 
          } 
         } 
        } 
       } 
      } 

Các Dịch chức năng mất như tham số được lựa chọn ngôn ngữ tùy chọn trong điều khiển thả xuống và thực hiện cuộc gọi không đồng bộ như được hiển thị bên dưới.

function Translate(lang) 
      { 
       var request = null; 
       if (window.XMLHttpRequest) 
       { 
        request = new XMLHttpRequest(); 
        if (request.overrideMimeType) 
        {       
         request.overrideMimeType('text/xml'); 
        } 
       } 
       else if (window.ActiveXObject) 
       { 
        request = new ActiveXObject("Msxml2.XMLHTTP"); 
       } 
       if (request == null) 
       { 
        return; 
       } 
       var url = "GetLoginTranslations.aspx";    
       request.open('GET', url +'?lang=' + lang, true); 
       request.setRequestHeader("Cache-Control", "no-cache"); 
       request.setRequestHeader("Pragma", "no-cache"); 
       request.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"); 
       request.onreadystatechange = function() { TranslateLabels(request); }; 
       request.send(null); 
      } 

chức năng Dịch ở trên thực hiện cuộc gọi và nhận kết quả trong trang .aspx được chỉ định (trong trường hợp này là "GetLoginTranslations.aspx ")

khi yêu cầu được hoàn thành và request.onreadystatechange được thiết lập để các TranslateLabels chức năng chức năng này sẽ được thực thi.

trên đường này postback không được thực hiện như trước đây trong trường hợp OnSelectedIndexChanged của DropDownList . kiểm soát

các TranslateLabels chức năng sẽ giống như thế:

function TranslateLabels(request) 
      {     
       if (request.readyState == 4) 
       { 
        if (request.status == 200) 
        { 
         if (request.responseXML) 
         { 
          var objRoot = request.responseXML.documentElement; 
          if (objRoot) 
          { 
           if (objRoot.nodeName == "strings") 
           { 
            for (var i = 0; i < objRoot.childNodes.length; i++) 
            { 
             var node = objRoot.childNodes[i]; 
             var elem; 
             switch (node.getAttribute("id")) 
             { 
              case "lbl_login": 
               elem = document.getElementById("lbl_login"); 
               if (elem) 
                elem.innerHTML = node.firstChild.nodeValue; 
               break; 
             } 
///.... 
} 
} 
} 
} 
} 
} 

các request.responseXML chứa XML được xây dựng trong trang GetLoginTranslations.aspx và cấu trúc của XML này được định nghĩa ở đó.

sự kiện Page_Load() trong GetLoginTranslations.aspx nên hình như:

protected void Page_Load(object sender, EventArgs e) 
     { 
    if (Request["lang"] != null) 
       strLang = Request["lang"]; 

      //init response 
      Response.Clear(); 
      Response.Cache.SetExpires(DateTime.Now); 
      Response.Cache.SetCacheability(HttpCacheability.NoCache); 
      Response.Cache.SetValidUntilExpires(true); 
      Response.ContentType = "application/xml"; 
      Response.Charset = "utf-8"; 


      XmlTextWriter xml = new XmlTextWriter(Response.OutputStream, System.Text.Encoding.UTF8) 
      { 
       Formatting = Formatting.None 
      }; 
      xml.WriteStartDocument(); 
      xml.WriteStartElement("strings"); 

      xml.WriteStartElement("string"); 
      xml.WriteAttributeString("id", "lbl_login"); 
      xml.WriteString(GetTranslation("label_login", strLang)); 
      xml.WriteEndElement(); 

      // ... the other labels 


      xml.WriteEndElement(); //</strings> 
      xml.Close(); 

     } 

Một số cân nhắc khác:

  • thiết lập AutoPostBack tài sản của DropDownList false.
3
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) 
    { 
     if (!(String.IsNullOrEmpty(txtPwd.Text.Trim()))) 
     { 
      txtPwd.Attributes["value"]= txtPwd.Text;    
     } 
     if (!(String.IsNullOrEmpty(txtConfirmPwd.Text.Trim()))) 
     { 
      txtConfirmPwd.Attributes["value"] = txtConfirmPwd.Text; 
     } 
    } 
} 
Các vấn đề liên quan