DropDownList OnSelectedIndexChange к 0th индексирует w/out ViewState

Vuejs будет использовать instanceof для проверки типа.

Таким образом, вы можете просто добавить File, если вам требуется оба типа:

  export default {
    name: 'BaseFile',
    props:   {
      label: { type: String },
      value: { type: [Object, File] },
      placeholder: { type: String, default: "Choose a file..." },
      acceptedExtensions: { type: String, default: "image/jpeg, image/png" }
    },
  }

Также я бы посоветовал инициализировать profileImage с помощью undefined или null IIUC, который вы не используете. .

6
задан Dave Baghdanov 23 January 2009 в 20:21
поделиться

2 ответа

Моя цель с отключением ViewState в этом выпадающем списке состоит в том, чтобы минимизировать размер ViewState для страницы.

Проблема я имел только с выполнением если (! Страница. IsPostBack) {... DataBind ()...}, то, что при выборе объекта впервые и перезагрузок страницы мой выпадающий список становится пустым.

То, что я закончил тем, что делал, создавало другое Свойство на этом управлении, LastIndex. Когда событие OnSelectedIndexChanged стреляет, я обновляю значение LastIndex. В Page_Load я сравниваю Текущие и Последние индексные значения, если они отличаются, затем стреляют, Индекс изменил событие.

    public int SelectedValue{
        get { return this.DropDownList1.SelectedItem.Value; }
    }

    public int LastIndex{
        get { return this.ViewState["lastIndex"] == null ? -1 : (int)this.ViewState["lastIndex"]; }
        set { this.ViewState["lastIndex"] = value; }
    }

    protected override void OnInit(EventArgs e){
        base.OnInit(e);
        this.DropDownList1.DataTextField = "Text";
        this.DropDownList1.DataValueField = "Value";
        this.DropDownList1.DataSource = fillQueueDropDown();
        this.DropDownList1.DataBind();
    }

    protected void Page_Load(object sender, EventArgs e){
        if (this.LastIndex != this.SelectedValue)
            this.OnSelectedQueueChanged(new EventArgs());
    }

    private ListItemCollection fillQueueDropDown(){...}

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e){
        OnSelectedQueueChanged(e);
        this.LastIndex = this.SelectedValue;
    }

    public event EventHandler queueNamesChangedEvent;
    public void OnSelectedQueueChanged(EventArgs e){
        if (queueNamesChangedEvent != null)
            queueNamesChangedEvent(this, e);
    }

Вы правы все же. Данные перезагружаются и повышение фазы OnInit. Затем ViewState восстанавливается (и когда индекс 0th восстанавливается), когда мы наконец добираемся до фазы Событий, управление не обнаруживает изменение.

Не уверенный это - самый изящный маршрут, но он работает хороший до сих пор.

Затем я нашел это в документах MSDN для IPostBackDataHandler:

  public virtual bool LoadPostData(string postDataKey, 
     NameValueCollection postCollection) {

     String presentValue = Text;
     String postedValue = postCollection[postDataKey];

     if (presentValue == null || !presentValue.Equals(postedValue)) {
        Text = postedValue;
        return true;
     }

     return false;
  }

Так как приведенная стоимость совпадает с измененным - для оценки, событие не запущено.

5
ответ дан 8 December 2019 в 18:42
поделиться

Проблема состоит в том, что Вы загружаете данные каждый раз, когда и это сбрасывает выбранный индекс. Предположите, что это - Ваше выпадающее:

zero [selected]
one
two

Затем в клиенте Вы изменяете выбранный индекс:

zero
one [selected]
two

Это заполняет скрытый вход __EVENTARGUMENT с Вашим новым индексом (1) и скрытым входом __EVENTTARGET с id из Вашего выпадающего. Теперь серверный код вталкивает и перезагружает Ваши данные:

zero [selected]
one
two

"нуль" является выбранным значением, потому что это - значение по умолчанию, когда данные загружаются. Затем ASP.NET ищет __EVENTTARGET и __EVENTARGUMENT в Request и находит Ваш dropdown's id и находит новый индекс (1). Теперь Ваше выпадающее похоже на это:

zero 
one [selected]
two

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

Теперь позволяет, говорят, что у нас все еще есть выпадающее в состоянии, это было только в (при этом "один" был выбран и выбранный индекс 1). Что происходит, когда мы выбираем первый объект в списке на клиенте?

__EVENTTARGET и __EVENTARGUMENT заполняются с id из выпадающего и нового индекса (0). Затем сервер загружает данные в выпадающее, и выпадающее теперь похоже на это снова:

zero [selected]
one
two

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

Вот то, как решить проблему:

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

    if (!Page.IsPostBack)
    {
        this.DropDownList1.DataTextField = "Text";
        this.DropDownList1.DataValueField = "Value";
        this.DropDownList1.DataSource = fillQueueDropDown();
        this.DropDownList1.DataBind();
    }    
}

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

8
ответ дан 8 December 2019 в 18:42
поделиться
Другие вопросы по тегам:

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