2009-08-31 26 views
5

Estoy mostrando 3 o más versiones de un formulario. Una versión es un formulario de edición para editar todos los campos. Una segunda versión será una versión de solo lectura del mismo formulario que se usará para mostrar todos los mismos campos pero con todos los campos con readonly = "true" en el lado del cliente para que el usuario no pueda ingresar datos. Los campos de solo lectura necesitan usar un estilo CSS diferente. Esto es para mostrar datos archivados. Ya estoy ocultando el botón de enviar para que no puedan enviarse, pero quiero que el formulario se vea como si fuera de solo lectura. Una tercera versión tendrá algunos campos de solo lectura y otros editables para una clase particular de usuarios que tenga privilegios de edición limitados.Hacer que todos los campos de formulario sean de solo lectura en MVC

Estoy usando ASP.NET MVC 1.0. ¿Cómo modifico todo (o un subconjunto) de los campos mostrados para que sean de solo lectura? Me gustaría iterar a través de la colección de campos en el controlador y configurarlos todos para solo leer y establecer la clase css correcta. No quiero tener que poner una declaración if en cada campo en el archivo .aspx (hay 40-50 campos) y preferiría no tener esto en el lado del cliente así puedo evitar que los usuarios modifiquen javascript/html para editar cosas que no deberían.

TIA,

Steve Shier

+3

Sólo una nota: "por lo que puede evitar que los usuarios modifiquen JavaScript/HTML para editar cosas que no se supone que deben". No suponga que solo porque lo bloquea en el html que un usuario no puede enviar datos de POST. Es muy fácil falsificar un POST. – jeef3

+0

Gracias por las respuestas. Utilizo una vista parcial para los contenidos del formulario. Me gustaría tratar el formulario como una colección de campos y elegir los campos de solo lectura basados ​​en parámetros externos (derechos del usuario). Quiero volver a utilizar la misma colección y establecer las propiedades de visualización basadas en los parámetros externos. Tendré lógica en el lado del servidor para asegurarme de que el usuario tenga los derechos correctos para una edición. Me gustaría hacer todo esto del lado del servidor y no usar jquery. Si utilizo parciales múltiples, tengo que copiar y pegar el código y tengo un problema de mantenimiento con una violación DRY. Gracias, Steve –

Respuesta

12

Tenga en cuenta que incluso si establece las etiquetas como de sólo lectura en el lado del servidor, los usuarios pueden todavía cambiarlos a través de una variedad de medios, y cualquiera que sea el valor en el formulario es antes de se le devuelve.

sin duda la forma más fácil es del lado del cliente con jQuery:

$(function() { 
    $('input, select, textarea').attr('disabled', 'disabled'); 
}); 

O bien, puede hacerlo en su opinión, pero es feo. En la parte superior de mi cabeza, necesitarías algún tipo de bool pasado a la Vista (a través de ViewData Supongo), y verifica que en cada ingrese para ver si debe agregar el atributo disabled. No es mi idea de diversión ...

+0

¿Cómo agregaría el atributo deshabilitado en el lado del servidor? –

+0

@Steve - @ Html.TextBoxFor (model => model.Property, new {disabled = "disabled"}) –

1

Tendría diferentes vistas que corresponden a sus estados y luego elijo la vista dependiendo del estado en el que se encuentre. También podría implementarlo con parciales, desglosando las piezas para que pueda puede incluir fácilmente versiones editables o de solo lectura de los diferentes conjuntos de elementos. La vista de solo lectura, entonces, ni siquiera necesita incluir un elemento de formulario. También podría presentar los datos en tramos, divs o párrafos en lugar de como elementos de entrada.

Nota: igual deberá verificar si el usuario actual tiene la capacidad de actualizar/crear datos en las acciones que procesan los envíos de formularios. Solo porque limite la capacidad de ver datos en un formato de solo lectura, eso no impedirá que alguien cree una publicación de formulario para imitar su aplicación si así lo desean. No puede confiar en ocultar/deshabilitar cosas en el cliente para evitar que un usuario malintencionado intente ingresar/modificar datos.

0

Normalmente uso vistas parciales para representar formularios y/o partes de formularios.

puedo pensar en dos formas sencillas de hacer lo que necesita (como lo entendía):

  1. <% Html.RenderPartial(the_right_partial, model); %> donde the_right_partial es o bien un valor que se pasa desde el controlador o un ayudante (en cuyo caso, the_right_partial(something)) ;
  2. pase un parámetro bool o enum del controlador que representa la capacidad de edición y luego usa un helper para obtener los atributos html correctos, como: <%= Html.TextBox("name", value, Html.TheRightHtmlAttributesFor(isReadableOrNot)) %>;

Puede haber otras maneras, como la creación de nuevos ayudantes para los campos de entrada que aceptan una Arg isReadableOrNot adicional (pero parece una exageración para mí), o como destrozando el html/aspx de alguna extraña (y totalmente ilegible/forma inmaculada), pero no los sugeriría.

en cuenta que el uso de atributos HTML como disabledes lado del cliente, y con herramientas como Firebug se tarda sólo dos segundos para cambiarlos.

Otros ya lo han dicho, pero también tengo que: siempre asumo que el usuario hará su mejor esfuerzo para hacer lo peor posible, así que verifique los derechos del usuario para modificar cosas del lado del servidor y considere al cliente verificaciones laterales como cortesía para el usuario (para que entienda que el formulario no debe editarse, en este caso).

0

Como estoy tratando de usar un solo parcial para los diferentes estados del formulario, creo que crearé funciones auxiliares que se mostrarán correctamente en función del estado y el usuario. Los ayudantes usarán un diccionario de campos que indicarán en qué condición el campo es de solo lectura. Todavía tendré controles del lado del servidor para asegurarme de que los datos sean válidos y que el usuario esté autorizado para realizar cambios.

Gracias por todas sus ideas y ayuda.

Steve

Cuestiones relacionadas