Постбэки и привязка данных - пропустить часть жизненного цикла страницы? - PullRequest
0 голосов
/ 28 августа 2010

Хорошо, у меня есть UserControl. В нем есть текстовое поле и другие подобные вещи, а также кнопка сохранения.

У меня есть этот UserControl в элементе управления Repeater в ItemTemplate.

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

Самым запутанным является то, что создается впечатление, что он создает новый экземпляр моего класса, но пропускает метод Page_Load и тому подобное. Это пример моего кода в UserControl

    Data.Report ThisReport;
    [Browsable(true)]
    public int ReportID
    {
        get;
        set;
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (ReportID == 0)
        {
            throw new ArgumentException("ReportID can not be 0");
        }
        var report = Data.Report.SingleOrDefault(x => x.ID==ReportID);
        txtName.Text = report.Description;
        ThisReport = report;
    }

    protected void btnSave_Click(object sender, EventArgs e)
    {
        var x=ThisReport.Foo; //ThisReport == null here.
    }

Используется в повторителе так:

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="ReportsData">
    <ItemTemplate>
        <uc:ReportManager ReportID="<%# ((Data.Report)Container.DataItem).ReportID %>"
        runat="server" />
    </ItemTemplate>
</asp:Repeater>

Почему, похоже, инициализируется новый экземпляр моего UserControl? Как мне преодолеть эту проблему?

1 Ответ

1 голос
/ 28 августа 2010

Похоже, что ваш контроль привязан только 1 раз, поэтому ReportID не получает правильное значение и

var report = Data.Report.SingleOrDefault (x => x.ID ==ReportID);

возвращает значение NULL.

Вы пытались поместить ReportID в viewstate?

public override int ReportID 
{
    get
    {
        if (this.ViewState["ReportID"] == null)
        {
            throw new ArgumentException("ReportID can not be 0");
        }
        return (int)this.ViewState["ReportID"];
    }
    set
    {
        this.ViewState["ReportID"] = value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...