Подтвердить что ты не робот

Почему я не могу получить доступ к представлению в представлении в usercontrol?

Я сохранил объект в viewstate на странице. Теперь, когда я обращаюсь к одному и тому же объекту viewat на usercontrol, он отображается как null. Я даже попытался создать одно и то же представление с таким же именем в usercontrol и page.Both имеет другое значение.

Я понимаю, что viewstate является защищенным свойством. Как эта вещь реализуется в вышеупомянутом scenerio или есть какая-либо другая причина такого поведения.

Edit:

Пользовательский элемент управления находится в разметке страницы. Я не загружаю его динамически.

У меня есть страница EditFacilityworkType.aspx. На странице У меня есть usercontrol FacilityWorkTypeDetails.aspx(FacilityWorkTypeDetails1). Внутри этого usercontrol у меня есть пользовательский элемент управления Workflow.aspx(Workflow1)

Страница_Load() страницы Я забираю workflowdetails на page_load() страницы.

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

Внутри usercontrol FacilityWorkTypeDetails.aspx. У меня есть свойство

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

Теперь я устанавливаю это свойство в загрузке страницы страницы

FacilityWorkTypeDetails1.FacilityWorkTypeDetails = facilityWorkType;

Внутри Workflow.aspx у меня есть свойство

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

Теперь PopulateControls() из FacilityWorkTypeDetails1, я устанавливаю свойство workflow1

private void PopulateControls (значение FacilityWorktype)   {

    Workflow1.WorkFlowDetails = value.FacilityWorkTypeWorkFlow;
}

Теперь, когда я извлекаю значения из

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

 }

Итак, теперь внутри этой функции workFlow имеет значение null. Я хочу спросить, почему это null, когда я установил viewstate на странице.

4b9b3361

Ответ 1

Scherand здесь очень прав. Я хотел бы добавить к тому, что он привел к столу.

Каждый элемент управления, который происходит из System.Web.UI.Control, имеет свойство ViewState. Под капотом свойство - это коллекция StateBag. Каждый экземпляр Control имеет свой собственный StateBag для ViewState, так как Scherand упоминается, ViewState уникален для элемента управления. Когда страница обрабатывается, все дерево управления страницы повторяется, все коллекции ViewState объединяются в древовидную структуру и окончательная структура сериализуется в строку и отображается на странице.

Поскольку свойство ViewState помечено как защищенное, вы не можете перейти на страницу ViewState из своего пользовательского элемента управления без использования отражения.

Но, честно говоря, вы должны отказаться от использования ViewState в качестве носителя данных. Вот несколько причин:

  • ViewState получает визуализацию и вывод в браузер клиента. Ведение объектов данных в коллекции раздувает ваш вывод на страницу.
  • Если на вашем ViewState не включено шифрование, закодированная строка, которая отображается в браузере клиента, может быть декодирована вручную, и любой пользователь может получить доступ к содержимому ваших объектов данных. Это довольно значительная уязвимость системы безопасности.

Похоже, все, что вы хотите сделать, это обмен данными между вашей страницей и элементами управления пользователя. Лучшим способом обмена данными между элементами управления является использование коллекции "Элементы" (которая является свойством класса HttpContext). Коллекция представляет собой Hashtable и может быть доступна из ваших страниц и элементов управления пользователя так:

Context.Items["Workflow"] = workflowInstance;

Наилучшая часть использования этого метода заключается в том, что он не несет никаких дополнительных накладных расходов или раздувает вывод страницы. Коллекция Items существует в контексте одного HTTP-запроса. Это означает, что когда ваш запрос будет выполнен и ваш вывод страницы будет отображен в клиентский браузер, коллекция Items будет удалена из памяти сервера. Это идеальный носитель для временного хранения данных в ASP.NET.

Теперь, если вы хотите, чтобы ваши объекты данных оставались доступными не только для текущего запроса, вам было бы лучше хранить объекты в сеансе.

Ответ 2

Я все еще не понимаю все здесь (см. мои комментарии выше). Но я уверен, что вы недопонимаете ViewState.

ViewState предназначен для каждого элемента управления, а не для каждого запроса или сеанса или что-то еще.

В вашем примере рассмотрим другой элемент управления (например, стандартный элемент управления ASP.NET), который по какой-то причине решил поместить что-то с "именем" WorkFlow в viewstate. Если то, что вы пытаетесь сделать, будет работать, этот объект перезапишет ваш (или наоборот, ваш будет перезаписан другим).

Или я что-то не хватает?

Возможно, прочитав TRULY Понимание ViewState может помочь вам понять, что такое viewstate/как это работает (да, мне очень нравится эта статья, это почему я продолжаю размещать эту ссылку).

Ответ 3

На обратной стороне вы создали элемент управления? Если код позади не создал ctrl, тогда он не узнает об этом.

применим только в том случае, если это сгенерированный элемент управления. Вам может потребоваться опубликовать код и получить дополнительную информацию, чтобы получить ответ propper.

Viewstate - это монстр, поэтому многие из нас идут в MVC.

Ответ 4

page viewstate - это другой государственный субок из окна просмотра, доступ к которому пользовательский контроль может получить. каждый элемент управления имеет свое собственное личное представление. Таким образом, вы не можете напрямую получить доступ к представлению страницы с помощью кода usercontrol.

вы можете выставлять значения вида просмотра со свойствами или методами, а затем вызывать эти свойства/методы