Включить ViewState для нескольких элементов управления и отключить для других / страницы

Вы можете использовать класс ZipFile для проверки вашего файла:

 static boolean isValid(final File file) {
    ZipFile zipfile = null;
    try {
        zipfile = new ZipFile(file);
        return true;
    } catch (IOException e) {
        return false;
    } finally {
        try {
            if (zipfile != null) {
                zipfile.close();
                zipfile = null;
            }
        } catch (IOException e) {
        }
    }
}
13
задан Zuhaib 9 October 2008 в 10:21
поделиться

5 ответов

Если Вы устанавливаете, выключают ViewState страницы, то нет никакого способа для Вас включить ViewState для определенных компонентов. Это вызвано тем, что ViewState является serialzed рекурсивно, поэтому когда, если Страница не разрешает ViewState, это не сериализирует ViewState ни для одного из, его - дочерние элементы управления.

В ответе на Ваш вопрос, если Вы не хотите явно выключать ViewState на отдельных средствах управления, но хотеть сохранить некоторые средства управления ViewState знающий, лучший способ записал бы небольшой служебный метод, который выключает ViewState для всех средств управления (использующий рекурсию или иначе). Тогда включите ViewState для средств управления, для которых требуется включить ViewState.

, С другой стороны, второй план и меньше мощного пути могут возможный, если средства управления являются группами в других контейнерных средствах управления (таких как Панель). Можно отключить ViewState для всех средств управления в Панели путем отключения ViewState Панели.

22
ответ дан Samuel Kim 9 October 2008 в 10:21
поделиться

Вот некоторый код, который подробно останавливается на понятии @Samuel Kim наличия способа отключить ViewState на почти определенных средствах управления (btw, это использует.NET 3.5):

List<string> allowedControls = new List<string> { "Control1", "Control3" };
IEnumerable<Control> controlsWithoutViewState = Page.Controls.Where(c => !allowedControls.Contains(c.ID));
foreach(Control c controlsWithoutViewState){
  if(c is WebControl) ((WebControl)c).EnableViewState = false;
}

единственная вещь я не на 100% уверен в (и у меня нет своего VM, работающего), то, ли Page. Средства управления должны быть брошены или нет, раз так просто иметь это вместо этого:

IEnumerable<Control> controlsWithoutViewState = Page.Controls.Cast<Control>().Where(c => !allowedControls.Contains(c.ID));

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

2
ответ дан Aaron Powell 9 October 2008 в 10:21
поделиться

Вы могли также наследоваться BasePage. На BasePage отключают ViewState.

/// <summary>
/// All pages inherit this page
/// </summary>
public class BasePage : System.Web.UI.Page {

    protected override void OnLoad(EventArgs e) {
        base.OnLoad(e);
    }

    public bool ViewStateEnabled {
        get {
            return Page.EnableViewState;
        }
        set {
            Page.EnableViewState = value;
        }
    }

    public BasePage() {
        // Disable ViewState By Default
        ViewStateEnabled = false;
    }
}

На каждой странице, что Вы хотите ViewState, Включил, Вы делаете следующее в Page_Load:

public partial class Products_Default : BasePage {
    protected void Page_Load(object sender, EventArgs e) {
        this.ViewStateEnabled = true;
    }
}

Это должно включить ViewState только для того, что Page (принимающий он идет в MasterPage).Примечание: Необходимо будет индивидуально установить ViewState каждого управления на том Page.

0
ответ дан Armstrongest 9 October 2008 в 21:21
поделиться

Вы также можете создать подкласс для встроенных элементов управления и в своем подклассе установить для свойства EnableViewState значение false.

0
ответ дан 1 December 2019 в 19:41
поделиться

Мне любопытно посмотреть, работает ли подход Самуэля. Если вы попробуете, опубликуйте свой результат.

Я не говорю, что Сэмюэль ошибался, мне было бы просто любопытно.

Мне любопытно, потому что, поскольку состояние просмотра сериализуется рекурсивно (как сказал Самуэль), если вы имел один элемент управления с включенным viewstate, который был дочерним элементом элемента управления с отключенным viewstate, тогда у дочернего элемента управления не было бы viewstate, потому что рекурсивная сериализация полностью пропустила бы его на родительском уровне. Это было бы особенно неприятно, если бы вы создали свои собственные пользовательские элементы управления, которые, естественно, будут содержать множество дочерних элементов управления.

Другим решением было бы использовать подход служебного метода Самуэля, но вместо того, чтобы отключать все, просто отключите его для элементов управления, таких как Label, Буквально и т. Д., У которых нет детей. ... или если у них есть дети, ничего страшного, если у них отключено состояние просмотра.

Естественно, вы не захотите отключать состояние просмотра панелей и заполнителей по причине, о которой я говорил выше.

Edit:

Public Shared Sub DisableViewState(ByVal cntrl As Control)
    If TypeOf cntrl Is Label Then
        cntrl.EnableViewState = False
    ElseIf TypeOf cntrl Is Literal Then
        cntrl.EnableViewState = False
    ElseIf TypeOf cntrl Is Button Then
        cntrl.EnableViewState = False
    Else
        If cntrl.Controls IsNot Nothing Then
            For Each subControl As Control In cntrl.Controls
                DisableViewState(subControl)
            Next
        End If
    End If
End Sub
0
ответ дан 1 December 2019 в 19:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: