2008-09-16 29 views
5

¿Alguien ha escrito alguna vez una función que pueda convertir todos los controles en una página aspx en una versión de solo lectura? Por ejemplo, si UserDetails.aspx se usa para editar y guardar información de un usuario, si alguien con permisos inapropiados ingresa a la página, me gustaría presentarla como de solo lectura. Por lo tanto, la mayoría de los controles se convertirían en etiquetas, cargadas con los datos correspondientes del control original editable.Cómo convertir todos los controles en un formulario web aspx a un equivalente de solo lectura

creo que probablemente sería una rutina bastante simple, es decir:

Dim ctlParent As Control = Me.txtTest.Parent 
Dim ctlOLD As TextBox = Me.txtTest 
Dim ctlNEW As Label = New Label 
ctlNEW.Width = ctlOLD.Width 
ctlNEW.Text = ctlOLD.Text 
ctlParent.Controls.Remove(ctlOLD) 
ctlParent.Controls.Add(ctlNEW) 

... es realmente todo lo que necesita para un cuadro de texto -> conversión de etiquetas, pero yo estaba esperando que alguien podría saber de una existe una función existente, ya que es probable que haya algunas trampas aquí y allá con ciertos controles y situaciones.

Actualización:
- Simplemente establecer la propiedad ReadOnly en true no es una solución viable, ya que parece tonto tener las cosas en gris de esa manera. - Evitar la creación manual de una vista secundaria es el objetivo principal de esto, así que usar una forma ingeniosa para mostrar una versión de solo lectura de la interfaz de usuario que se construyó a mano usando etiquetas es lo que estoy tratando de evitar.

Gracias!

Respuesta

2

Se puede usar un multivisión y sólo tienen una vista de la pantalla y una vista de edición .. luego hacer sus tareas como:

lblWhatever.Text = txtWhatever.Text = whateverOriginatingSource; 
lblSomethingElse.Text = txtSomethingElse.Text = somethingElseOriginatingSource; 

myViews.SelectedIndex = myConditionOrVariableThatDeterminesEditable ? 0 : 1; 

luego alternar las vistas que sobre la base de permisos.

no es el más elegante, pero probablemente funcione para su situación.

Tal vez debería elaborar un poco ... descartar el psuedo (no estoy seguro de si tengo el yada del índice seleccionado, yada correcta ... pero entiendes el punto).

<asp:Multiview ID="myViews" SelectedIndex="1"> 
    <asp:View ID="EditView"> 
     <asp:TextBox ID="txtWhatever" /><br /> 
     <asp:TextBox ID="txtSomethingElse" /> 
    </asp:View> 
    <asp:View ID="DisplayView"> 
     <asp:Label ID="lblWhatever" /><br /> 
     <asp:Label ID="lblSomethingElse" /> 
    </asp:View> 
</asp:Multiview> 
0

¿Qué hay de la creación de su propia biblioteca de controles, que rinden de forma diferente si ReadOnly es verdadero. Algo así como:

MyTextBox : TextBox { 
    public override void RenderControl(HtmlTextWriter writer) { 
     if (this.ReadOnly) { 
      writer.WriteBeginTag("label"); 
      writer.Write(this.Value); 
      writer.WriteEndTag(); 
     } 
    } 
} 

Hay una manera de utilizar web.config para reemplazar todos los asp: TextBox casos con su propio control sin tener que editar a mi: Cuadro de texto - pero estoy teniendo problemas para encontrar el cajero automático de referencia.

De lo contrario, probablemente solo escribiría un fragmento de jQuery para hacerlo.

0

No conozco ninguna función existente, pero no es tan difícil procesar los controles usted mismo. Lo importante de lo que tendrá que preocuparse es que no haya controles ASP.NET en el árbol de control. (por ej.)

Puede controlar los casos al tipo apropiado y simplemente comprobar si hay nulo, y luego tratar con cada control correctamente.

0

A menos que cree sus propios controles, me temo que la ruta a la que no quiere ir (hacer una segunda página de solo etiquetas) es probablemente una ruta bastante buena simplemente porque no quiere que alguien se ejecute Firebug puede editar HTML sobre la marcha para simplemente desactivar el control que tenga en su lugar y simplemente usar la página como si tuviera derecho a actualizarla.

0

Use a DetailsView. Hace exactamente lo que quiere basado en el modo actual de la página.

3

Scott Mitchell publicó un buen artículo sobre esto hace un tiempo.

http://aspnet.4guysfromrolla.com/articles/012506-1.aspx

he utilizado este enfoque en el pasado en conjection con CSS en los '' campos de sólo lectura para que se vean y funcionan exactamente igual que una etiqueta, a pesar de que están en los cuadros de texto de datos.

Cuestiones relacionadas