Текстовое поле в модальном всплывающем окне вставляет повторяющиеся записи - PullRequest
1 голос
/ 15 ноября 2011

Предполагается, что в мое текстовое поле вводится одно значение и вводится примерно 8 из одного и того же.Кто-нибудь знает почему?

    <li class="item">
        <asp:LinkButton ID="FeatureButton" runat="server">Feature</asp:LinkButton>
        <asp:Panel ID="FeaturePanel" runat="server" CssClass="modalPopup" 
         Style="display:none">
            <div class="PopupHeader">Add a Feature</div>
            <asp:CheckBoxList ID="cbxAddFeature" runat="server" 
             DataSourceID="dsNewFeatures" DataTextField="FeatureTitle" 
             DataValueField="FeatureID"></asp:CheckBoxList>
            New Feature:<asp:TextBox ID="txtFeature" runat="server"></asp:TextBox>
            <asp:Label ID="FeatureError" runat="server" ></asp:Label>
            <asp:Button ID="SubmitFeatures" runat="server" Text="Submit" />
            <asp:Button ID="CancelSubmitFeatures" runat="server" Text="Cancel" />
        </asp:Panel>
        <asp:ModalPopupExtender ID="FeatureModal" runat="server" 
         BackgroundCssClass="modalBackground" 
         CancelControlID="CancelSubmitFeatures" DropShadow="True" 
         DynamicServicePath="" Enabled="True" PopupControlID="FeaturePanel" 
         TargetControlID="FeatureButton"></asp:ModalPopupExtender>
Protected Sub SubmitFeatures_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Handles SubmitFeatures.Click
    FeatureModal.Hide()
    For Each feature As ListItem In cbxAddFeature.Items
        If feature.Selected Then
            'SQL INSERT: Marketing Table
            Dim strSQL As String = "INSERT INTO Marketing (ProductID,
                                    MarketingTypeID, MarketingTitle, MarketingData) 
                                    VALUES (@ProductID, 3, 'Feature', @MarketingData);
                                    UPDATE Product SET ModifyDate = getdate(),
                                    ModifyUser = @ModifyUser 
                                    WHERE ProductID = @ProductID"

Это код для всего модального всплывающего окна, который также включает вставку для флажков.Если пользователь не видит соответствующий флажок, он может ввести новое значение через текстовое поле.

Protected Sub SubmitFeatures_Click(ByVal sender As Object, ByVal e 
As System.EventArgs) Handles SubmitFeatures.Click
    FeatureModal.Hide()
    For Each feature As ListItem In cbxAddFeature.Items
        If feature.Selected Then

            Dim strSQL As String = "INSERT INTO Marketing (ProductID,
                                    MarketingTypeID, MarketingTitle, MarketingData) 
                                    VALUES (@ProductID, 3, 'Feature', @MarketingData);
                                    UPDATE Product SET ModifyDate = getdate(),
                                    ModifyUser = @ModifyUser
                                    WHERE ProductID = @ProductID"

            Using cn As New SqlConnection
             (System.Configuration.ConfigurationManager.ConnectionStrings
             ("LocalSqlServer").ConnectionString)

                Using cmd As New SqlCommand(strSQL, cn)

                    cmd.Parameters.Add(New SqlParameter("@ProductID", 
                    ProductID.Value))
                    cmd.Parameters.Add(New 
                    SqlParameter("@MarketingData", feature.Value))
                    cmd.Parameters.Add(New SqlParameter("@ModifyUser",
                    System.Web.HttpContext.Current.User.Identity.Name))

                    cn.Open()

                    cmd.ExecuteNonQuery()
                End Using

                cn.Close()
            End Using
        Else
        End If
        If Not String.IsNullOrEmpty(txtFeature.Text) Then
            Dim featureSql As String = "INSERT INTO Feature (FeatureTitle)
                                        VALUES (@FeatureTitle);
                                        INSERT INTO Marketing(ProductID, 
                                        MarketingTypeID, MarketingTitle, MarketingData) 
                                        VALUES (@ProductID, 3, 'Feature', 
                                        scope_identity());
                                        UPDATE Product SET ModifyDate = getdate(), 
                                        ModifyUser = @ModifyUser 
                                        WHERE ProductID = @ProductID"

            Using cn As New SqlConnection
            (System.Configuration.ConfigurationManager.ConnectionStrings
            ("LocalSqlServer").ConnectionString)

                Using cmd As New SqlCommand(featureSql, cn)

                    cmd.Parameters.Add(New SqlParameter("@FeatureTitle",
                    txtFeature.Text))
                    cmd.Parameters.Add(New SqlParameter("@ProductID", 
                    ProductID.Value))
                    cmd.Parameters.Add(New SqlParameter("@ModifyUser", 
                    System.Web.HttpContext.Current.User.Identity.Name))

                    cn.Open()

                    cmd.ExecuteNonQuery()
                End Using

                cn.Close()
            End Using
        End If
    Next
    'keep tab active and redirect to same page
    Session("ActiveTabIdx") = TabContainer1.ActiveTabIndex
    Response.Redirect(Request.RawUrl)
End Sub

Ответы [ 2 ]

1 голос
/ 15 ноября 2011

Я думаю, что это из-за этого:

If feature.Selected Then
 ...   
Else
  ....
End If

Это означает, что для каждого элемента в списке флажков он всегда будет идти в блок Else, когда флажок не установлен, что вызывает многократные вставки.

Дополнительные предложения

Не смешивайте свой код пользовательского интерфейса и код доступа к данным на одном и том же классе / странице.Хорошей практикой является отделение пользовательского интерфейса от бизнес-логики от логики доступа к данным.Например, этот код:

Dim strSQL As String = "INSERT INTO Marketing (ProductID,
                                    MarketingTypeID, MarketingTitle, MarketingData) 
                                    VALUES (@ProductID, 3, 'Feature', @MarketingData);
                                    UPDATE Product SET ModifyDate = getdate(),
                                    ModifyUser = @ModifyUser
                                    WHERE ProductID = @ProductID"

            Using cn As New SqlConnection
             (System.Configuration.ConfigurationManager.ConnectionStrings
             ("LocalSqlServer").ConnectionString)

                Using cmd As New SqlCommand(strSQL, cn)

                    cmd.Parameters.Add(New SqlParameter("@ProductID", 
                    ProductID.Value))
                    cmd.Parameters.Add(New 
                    SqlParameter("@MarketingData", feature.Value))
                    cmd.Parameters.Add(New SqlParameter("@ModifyUser",
                    System.Web.HttpContext.Current.User.Identity.Name))

                    cn.Open()

                    cmd.ExecuteNonQuery()
                End Using

                cn.Close()
            End Using

Может быть полностью перемещен в другой класс, который получает 3 параметра: UserID, ProductID и MarketingData.Делая это, вы можете использовать его в других местах (например, на страницах) вместо того, чтобы повторять логику снова и снова.

Оптимально, у вас должен быть бизнес-уровень, который вызывает ваш уровень доступа к данным (вышеупомянутый код войдет в ваш уровень доступа к данным), но по крайней мере перемещение этого кода в другое место является хорошим началом.Еще одно преимущество, помимо возможности повторного использования вашего кода, состоит в том, что, предположив, что вы обнаружили ошибку в этой подпрограмме, вы можете исправить ее в одном месте, а не в других местах приложения, чтобы исправить ошибку.

1 голос
/ 15 ноября 2011

Выйти код для вставки новой функции из для каждого цикла.

...