asp.net

asp.net - ¿Por qué no puedo acceder a la página viewstate en usercontrol?



(4)

Guardé un objeto en viewstate en la página. Ahora, cuando accedo al mismo objeto viewsate en usercontrol, se muestra como nulo. Incluso intenté crear el mismo estado de vista con el mismo nombre en usercontrol y page. Ambos tienen un valor diferente.

Entiendo que viewstate es una propiedad protegida. ¿Cómo se implementa esto en el escenario anterior o hay alguna otra razón para este comportamiento?

Editar:

Usercontrol está allí en el marcado de página. No lo estoy cargando dinámicamente.

Tengo una página EditFacilityworkType.aspx. En la página tengo un usercontrol FacilityWorkTypeDetails.aspx (FacilityWorkTypeDetails1). Dentro de este control de usuario tengo un control de usuario Workflow.aspx (Workflow1)

Page_Load () of Page Estoy recuperando detalles de flujo de trabajo en page_load () de la página.

FacilityWorktype facilityWorkType = facilityDetails.GetFacilityWorktypeDetail(SessionHelper.FacilityWorkTypeID); ViewState["WorkFlow"] = facilityWorkType.FacilityWorkTypeWorkFlow

Dentro de usercontrol FacilityWorkTypeDetails.aspx. Tengo una propiedad

public FacilityWorktype FacilityWorkTypeDetails { get { #region Fill FacilityWorktype return GetEntityFromControl(); #endregion } set { PopulateControls(value); } }

Ahora establezco esta propiedad en la página de carga de la página

FacilityWorkTypeDetails1.FacilityWorkTypeDetails = facilityWorkType;

Dentro de Workflow.aspx, tengo una propiedad

/// <summary> /// Property to fill entity object from controls on this page /// </summary> public WorkFlow WorkFlowDetails { get { return GetEntityFromControls(); } set { BindTranscriptionMethodDDL(ddlTranscMethod); PopulateControls(value); } }

Ahora PopulateControls () de FacilityWorkTypeDetails1, estoy configurando la propiedad de workflow1

Private Void PopulateControls (valor de FacilityWorktype) {

Workflow1.WorkFlowDetails = value.FacilityWorkTypeWorkFlow; }

Ahora cuando estoy recuperando valores de

private WorkFlow GetEntityFromControls() { WorkFlow workFlow = (ViewState["WorkFlow"] as WorkFlow) ?? new WorkFlow(); //workFlow is null }

Así que ahora dentro de esta función, workFlow es nulo. Quiero preguntar, ¿por qué es nulo cuando he configurado viewstate en la página?


¿En la devolución de datos creaste el control? Si el código detrás no ha creado el ctrl, entonces no lo sabrá.

Solo aplicable si este es un control generado. Es posible que necesite publicar un código y más información para obtener una respuesta correcta.

Viewstate es un monstruo por lo que muchos de nosotros vamos a MVC.


El estado de visualización de la página es una bolsa de estado diferente a la del estado de visualización al que puede acceder el control de usuario. Cada control tiene su propio estado visual. Por lo tanto, no puede acceder directamente al estado de visualización de la página desde un código de control de control de usuario.

podría exponer los valores de viewstate con propiedades o métodos y luego llamar a esas propiedades / métodos


Scherand es muy correcto aquí. Me gustaría agregar a lo que él ha traído a la mesa.

Cada control que deriva de System.Web.UI.Control tiene la propiedad ViewState. Bajo el capó, la propiedad es una colección de StateBag. Cada instancia de un Control tiene su propio StateBag para ViewState, por lo que Scherand lo mencionó, ViewState es exclusivo del control. Cuando la página se representa, todo el árbol de control de la página se itera, todas las colecciones de ViewState se combinan en una estructura similar a un árbol y esa estructura final se serializa en una cadena y se representa en la página.

Debido a que la propiedad ViewState está marcada como protegida, no puede acceder a ViewState de la página desde su control de usuario sin el uso de la reflexión.

Pero, con toda honestidad, debe abandonar el uso de ViewState como medio de almacenamiento de datos. Aquí hay algunas razones de por qué:

  1. ViewState se procesa y se envía al navegador del cliente. Mantener los objetos de datos en la colección aumenta la salida de tu página.
  2. A menos que tenga el cifrado habilitado en su ViewState, la cadena codificada que se procesa en el navegador del cliente se puede decodificar manualmente y simplemente cualquier persona puede acceder al contenido de sus objetos de datos. Esta es una vulnerabilidad de seguridad bastante importante.

Realmente parece que todo lo que quiere hacer es compartir datos entre su página y los controles de usuario. La mejor manera de compartir datos entre controles es hacer uso de la colección "Elementos" (que es una propiedad de la clase HttpContext). La colección es un Hashtable y se puede acceder a ella desde la página y los controles de usuario, como:

Context.Items["Workflow"] = workflowInstance;

La mejor parte del uso de esta técnica es que no incurre en gastos generales adicionales ni aumenta la salida de la página. La colección de elementos existe en el contexto de una única solicitud HTTP. Esto significa que cuando se realiza su solicitud y la salida de su página se ha procesado en el navegador del cliente, la colección de elementos se borra de la memoria del servidor. Es el medio ideal para el almacenamiento temporal de datos dentro de ASP.NET.

Ahora, si desea que sus objetos de datos permanezcan accesibles por más que solo la solicitud actual, será mejor que almacene los objetos en la sesión.


Sigo sin asimilar todo aquí (ver mis comentarios más arriba). Pero estoy bastante seguro de que no está entendiendo a ViewState .

ViewState es por control , no por solicitud o sesión o lo que sea.

En su ejemplo, considere algún otro control (por ejemplo, un control ASP.NET estándar) que, por alguna razón, decidió poner algo con un "nombre" de WorkFlow en el estado de vista. Si lo que intentas hacer funcionaría, este objeto sobrescribiría el tuyo (o al revés, el tuyo sería sobrescrito por el otro).

¿O me estoy perdiendo algo?

Tal vez la lectura de TRULY Understanding ViewState podría ayudarlo a comprender qué estado de visualización es / cómo funciona (sí, me gusta mucho este artículo, por eso sigo publicando ese enlace).