ASP.NET C#, потребность нажать кнопку дважды, чтобы заставить что-то произойти

Существует структура, называемая ReactiveUI - она ​​использует ReactiveExtensions и наблюдаемые, чтобы упростить жизнь MVVM.

У вас нет глубокого погружения и вы используете весь каркас, но у него есть четкая концепция Взаимодействие :

public class ViewModel : ReactiveObject
{
    private readonly Interaction confirm;

    public ViewModel()
    {
        this.confirm = new Interaction();
    }

    public Interaction Confirm => this.confirm;

    public async Task DeleteFileAsync()
    {
        var fileName = ...;

        // this will throw an exception if nothing handles the interaction
        var delete = await this.confirm.Handle(fileName);

        if (delete)
        {
            // delete the file
        }
    }
}

public class View
{
    public View()
    {
        this.WhenActivated(
            d =>
            {
                d(this
                    .ViewModel
                    .Confirm
                    .RegisterHandler(
                        async interaction =>
                        {
                            var deleteIt = await this.DisplayAlert(
                                "Confirm Delete",
                                $"Are you sure you want to delete '{interaction.Input}'?",
                                "YES",
                                "NO");

                            interaction.SetOutput(deleteIt);
                        }));
            });
    }
}

Вы можете просто сосредоточиться на взаимодействиях.

Я бы также рекомендовал ReactiveCommand, чтобы избежать проблем с кнопками и асинхронными действиями.

7
задан 17 November 2008 в 22:36
поделиться

5 ответов

Быть очень ясным. Случай нажатия кнопки происходит после события Page_Load, означающего, что фильтрация не становится прикладной на первой обратной передаче. Это было обновлено на второй обратной передаче, и Вы видите фильтрацию. Самое простое изменение, чтобы заставить Ваш код работать состоит в том, чтобы переместить весь код в Ваше событие Page_Load в OnPreRender, таким образом, перезагрузка происходит после события нажатия кнопки.

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

 
protected void Page_Load(object sender, EventArgs e)
{    
    if (!Page.IsPostBack)
        {   
             LoadData()
        }
}

private void LoadData()
{
    labDownloadList.Text = null;
    //Session variables:    
    if (Session["Game"] != null)
    ...
}

protected void btnFilter_Click(object sender, EventArgs e)
{    
    game = lstGames.SelectedValue;
    modtype = lstTypeMod.SelectedValue;
    filter = true;
    LoadData();
}
 

Последняя часть быстрого совета для подающего надежды разработчика ASP.NET должна полностью изучить жизненный цикл страницы. Знание последовательности событий на странице важно.Удачи.

11
ответ дан 6 December 2019 в 06:26
поделиться

Обзор Microsoft Жизненного цикла Страницы может быть полезным в понимании потока (и решение Вашего вопроса).

7
ответ дан 6 December 2019 в 06:26
поделиться

Обработчики событий нажатия кнопки происходят ПОСЛЕ Page_Load. Попытайтесь использовать Page_LoadComplete вместо этого.

Так, в Вашем коде, когда-то кнопка нажата, page_load событие запускает и устанавливает данные, затем btnClick событие запускает и изменяет данные. Но, данные были уже связаны в, он - старая форма. Вот почему требуется 2 щелчка для него для работы.

При помещении того же кода page_load в page_loadcomplete событие вместо этого, это произойдет после btnClick события. Это должно привести к желаемому результату.

6
ответ дан 6 December 2019 в 06:26
поделиться

JackCom, решение работало!Спасибо. И я изучу жизненный цикл страницы. Я должен добавить, что у меня только есть опыт в разработке программного обеспечения, я только что запустил с веб-разработки этой осенью.

1
ответ дан 6 December 2019 в 06:26
поделиться

Я не вижу типичное

if (!Page.IsPostBack)
{
   ...
}

в Вашем методе Page_Load, что означает, что Ваш datbinding произойдет каждый раз, страница загружается, наиболее вероятное порождение Вашей проблемы. Я предложил бы добавить, что к коду и видят, решает ли он вопрос.

2
ответ дан 6 December 2019 в 06:26
поделиться
Другие вопросы по тегам:

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