asp.net редактирование данных

Я читаю данные из базы данных и показываю их на странице для редактирования:

    <h2>Create new topic: 
    <asp:Label ID="_lblTopicName" runat="server" Text=""></asp:Label></h2>
      <p>
      Edit Level:
      <br/>
      <asp:DropDownList ID="_dtlEditRole" runat="server"></asp:DropDownList>
      <br/>
      View Level:
      <br/>
      <asp:DropDownList ID="_dtlViewRole" runat="server"></asp:DropDownList>
      <br/>
      <asp:TextBox ID="_tbxTopicText" TextMode="MultiLine" runat="server" Height="204px" 
        Width="885px"></asp:TextBox>
    </p>
  <asp:Button ID="_btnSaveTopic" runat="server" Text="Save" onclick="_btnSaveTopic_Click" />

Я заполняю поля в Page_PreRender() примерно так:

    private string _topicString;
    private Topic _topic = null;
    private Topics_GetTopicByTopicResult _findTopicResults = null;

    protected void Page_PreRender(object sender, EventArgs e)
    {
        // Load the User Roles into checkboxes.
        _dtlEditRole.DataSource = Roles.GetAllRoles();
        _dtlEditRole.DataBind();
        _dtlViewRole.DataSource = Roles.GetAllRoles();
        _dtlViewRole.DataBind();

        _topicString = Request.QueryString["Topic"];

        if (String.IsNullOrEmpty(_topicString))
        {
            Response.Redirect("~/Default.aspx");
        }
        else
        {
            _topic = new Topic();
            _findTopicResults = _topic.FindTopic(_topicString);

            if (_topic != null)
            {
                // Check if the user has permission to access
                if (RoleHelper.IsEditAllowed(_findTopicResults.ViewRoleName))
                {
                    _lblTopicName.Text = _findTopicResults.Topic;
                    _tbxTopicText.Text = _findTopicResults.Text;

                    _dtlEditRole.SelectedValue = _findTopicResults.EditRoleName;
                    _dtlViewRole.SelectedValue = _findTopicResults.ViewRoleName;
                }
                else
                {
                    Response.Redirect("~/Error.aspx?ReturnUrl=" + HttpUtility.UrlEncode(Request.RawUrl));
                }
            }
            else
            {
                Response.Redirect("~/CreateTopic.aspx?Topic=" + _topicString);
            }
        }
    }

Но теперь, когда я нажимаю _btnSaveTopic кнопка поля:

    private string _topicString;
    private Topic _topic = null;
    private Topics_GetTopicByTopicResult _findTopicResults = null;

Все они равны NULL, и я не могу обновить что-либо.

Вот мое событие нажатия кнопки:

    protected void _btnSaveTopic_Click(object sender, EventArgs e)
    {
            _topic.UpdateTopic(_findTopicResults.ID, _findTopicResults.Topic, _tbxTopicText.Text,
                               _dtlViewRole.SelectedItem.Text, _dtlEditRole.SelectedItem.Text);
            Response.Redirect("~/ViewPage.aspx?Topic=" + _topicString);
    }

Что было бы правильным способом сделать это?

2 ответа

Решение

Жизненный цикл страницы ASP.NET гласит, что Page_Init следует использовать для "инициализации свойств элемента управления", что похоже на то, что вы делаете.

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

Вы можете начать, щелкнув правой кнопкой мыши раздел выделенного кода в Visual Studio -> Refactor -> Извлечь метод

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

Вы повторно связываете выпадающий список (и, следовательно, стираете 'SelectedValue') в вашем методе Page_PreRender. Оберните метод в

protected void Page_PreRender(object sender, EventArgs e)
{
  if( !IsPostBack){
    //your current code
  }
}

и это должно работать.

Другие вопросы по тегам