Member 14192762 Ответов: 0

Обработка событий работает не для всех элементов управления в моем приложении. ASP.NET веб-приложение


Any button Onclick event is not working on my project. I inserted one more button called button1 for testing if it works but found that it is not working by changing the text of a label. Unfortunately, It is not working at all. Only page load event-driven is working.

The problem is not solved with other controls. For example, after the user clicks on an update button, a function will be called that checks the value in the textbox and make some calculation. After debugging, I found that the program cannot read any values from the textbox.

Note: I am using packages like bootstrap, Ajax as they are already built-in in the asp.net web forms web applications. I have also tried to exclude them from the project as mentioned in some references, however, nothing changed.


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

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="ShoppingCart.aspx.cs" Inherits="Celebreno.ShoppingCart" %>

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">



    <div id="ShoppingCartTitle" runat="server" class="ContentHead">
        <h1>Shopping Cart</h1>
    </div>

    <%--Start of the GridView to display the items in the cart--%>
    <asp:GridView ID="CartList" runat="server" AutoGenerateColumns="False" ShowFooter="True" GridLines="Vertical" CellPadding="4"
        ItemType="Celebreno.Models.ItemsInCart" SelectMethod="GetShoppingCartItems"
        CssClass="table table-striped table-bordered">
        <Columns>

            <%--problem solved : change "ID" to "ServicePack.ID"--%>
            <asp:BoundField DataField="ServicePack.ID" HeaderText="Service Package ID" SortExpression="ID" />
            <asp:BoundField DataField="ServicePack.Provider" HeaderText="Provider" />
            <asp:BoundField DataField="ServicePack.UnitPrice" HeaderText="Price (each)" DataFormatString="{0:c}" />
            <asp:TemplateField HeaderText="Quantity">
                <ItemTemplate>
                    <asp:TextBox ID="PurchaseQuantity" Width="40" runat="server" Text="<%#: Item.Quantity %>" ></asp:TextBox>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Item Total">
                <ItemTemplate>
                    <%#: String.Format("{0:c}", ((Convert.ToDouble(Item.Quantity)) *  Convert.ToDouble(Item.ServicePack.UnitPrice)))%>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Remove Item">
                <ItemTemplate>

                    <%--checkbox for removing the item--%>
                    <asp:CheckBox ID="Remove" runat="server"></asp:CheckBox>

                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    <%--End of the GridView--%>

    <div>
        <p></p>
        
            <asp:Label ID="LblTotalText" runat="server" Text="Order Total: "></asp:Label>
            <asp:Label ID="LblTotal" runat="server" EnableViewState="false"></asp:Label>
        
    </div>
    <br />



    <table>
        <tr>
            <td>
                <asp:Button ID="UpdateBtn" runat="server" Text="Update" OnClick="UpdateBtn_Click" CausesValidation="False" UseSubmitBehavior="false" />
               
            </td>
            <td>

                <%--Checkout PlaceHolder--
                <asp:ImageButton ID="CheckoutImageBtn" runat="server"
                    ImageUrl="https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif"
                    Width="145" AlternateText="Check out with PayPal"
                    OnClick="CheckoutBtn_Click"
                    BackColor="Transparent" BorderWidth="0" CausesValidation="False" /> --%>



                <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="CheckOut" CausesValidation="False" UseSubmitBehavior="false" />



            </td>
        </tr>
    </table>



</asp:Content>




И это код, стоящий за веб - страницей:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;


using Celebreno.Models;
using Celebreno.Cart;

//for cart update
using System.Collections.Specialized;
using System.Collections;
using System.Web.ModelBinding;



namespace Celebreno
{
    public partial class ShoppingCart : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            //2- Display the total of cart by calling GetTotal() function(located in Actions_of_Cart class)
            //and then store the return value in a new variable, then dispaly it in a label
            using (Actions_of_Cart usersShoppingCart = new Actions_of_Cart())
            {

                //declare a new variable to store the total into it
                decimal cartTotal = 0;
                cartTotal = usersShoppingCart.GetTotal();

                if (cartTotal > 0)
                {
                    //Display Total in a label that has property " Enable ViewState = False"
                    //      ViewSate used
                    LblTotal.Text = String.Format("{0:c}", cartTotal);
                }
                else
                {
                    LblTotalText.Text = "";
                    LblTotal.Text = "";
                    //HtmlGenericControl
                    ShoppingCartTitle.InnerText = "The Shopping Cart is Empty";
                    //not yet needed
                   UpdateBtn.Visible = false;
                    //CheckoutImageBtn.Visible = false;
                }
            }



        }










        //1- decalre the select Method (used in GridView in Source Code) to return the value of..
        //..calling GetCartItems(), which is defined in Actions_of_Cart DB class
        public List<ItemsInCart> GetShoppingCartItems()
        {
            Actions_of_Cart actions = new Actions_of_Cart();
            return actions.GetCartItems();
        }













        //for cart update
        //this will loop throw the items in the cart and call update and remove button
        public List<ItemsInCart> UpdateCartItems()
        {
            using (Actions_of_Cart usersShoppingCart = new Actions_of_Cart())
            {
                String cartId = usersShoppingCart.GetCartId();

                Actions_of_Cart.ShoppingCartUpdates[] cartUpdates = new Actions_of_Cart.ShoppingCartUpdates[CartList.Rows.Count];
                for (int i = 0; i < CartList.Rows.Count; i++)
                {
                    IOrderedDictionary rowValues = new OrderedDictionary();
                    rowValues = GetValues(CartList.Rows[i]);
                    cartUpdates[i].ProductId = Convert.ToInt32(rowValues["ProductID"]);

                    CheckBox cbRemove = new CheckBox();
                    cbRemove = (CheckBox)CartList.Rows[i].FindControl("Remove");
                    cartUpdates[i].RemoveItem = cbRemove.Checked;

                    TextBox quantityTextBox = new TextBox();
                    quantityTextBox = (TextBox)CartList.Rows[i].FindControl("PurchaseQuantity");
                    cartUpdates[i].PurchaseQuantity = Convert.ToInt16(quantityTextBox.Text.ToString());


                    //TextBox quantityTextBox = new TextBox();
                    //quantityTextBox = (TextBox)CartList.Rows[i].FindControl("PurchaseQuantity");
                    //int a = 0;
                    //if (Int32.TryParse(quantityTextBox.Text, out a ))
                    //{
                      //cartUpdates[i].PurchaseQuantity = a;
                    //}

                }


                usersShoppingCart.UpdateShoppingCartDatabase(cartId, cartUpdates);
                CartList.DataBind();
                LblTotal.Text = String.Format("{0:c}", usersShoppingCart.GetTotal());
                return usersShoppingCart.GetCartItems();
            }
        }



        public static IOrderedDictionary GetValues(GridViewRow row)
        {
            IOrderedDictionary values = new OrderedDictionary();
            foreach (DataControlFieldCell cell in row.Cells)
            {
                if (cell.Visible)
                {
                    // Extract values from the cell.
                    cell.ContainingField.ExtractValuesFromCell(values, cell, row.RowState, true);
                }
            }
            return values;
        }




        protected void UpdateBtn_Click(object sender, EventArgs e)
        {
            UpdateCartItems();
        }









        protected void CheckoutBtn(object sender, ImageClickEventArgs e)
        {
            using (Actions_of_Cart usersShoppingCart = new Actions_of_Cart())
            {
                Session["payment_amt"] = usersShoppingCart.GetTotal();
            }
            Response.Redirect("Checkout/CheckoutStart.aspx");
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            using (Actions_of_Cart usersShoppingCart = new Actions_of_Cart())
            {
                Session["payment_amt"] = usersShoppingCart.GetTotal();
            }
            Response.Redirect("Checkout/CheckoutStart.aspx");
        }
    }
}


Что я уже пробовал:

I have solved the problem of button event handling by adding these attributes. but when comes to other types of controls, these attributes cannot be included, so that problem is not solved.

<pre><asp:Button ID="UpdateBtn" runat="server" OnClick="UpdateBtn_Click" Text="Button" CausesValidation="False" UseSubmitBehavior="false" />

F-ES Sitecore

Обработка событий и доступ к ним управляют всей работой. Если они не работают для вас, это как-то связано с вашей наценкой и кодом, но поскольку вы не опубликовали ни того, ни другого, трудно дать конкретный совет.

Member 14192762

Привет, спасибо за ваш комментарий. Я обновил вопрос и включил полный код веб-страницы. Кстати, проблема возникает во всех формах приложения, а не только в этой. Некоторые элементы управления, с которыми я столкнулся с проблемой, - это кнопка изображения, так как вы можете видеть, что я пытался использовать кнопку вместо нее для обработки события щелчка, однако это не должно быть решением проблемы.

F-ES Sitecore

Событие click для ImageButton называется "CheckoutBtn_Click", но обработчик в коде называется "CheckoutBtn". Эти два должны совпадать, иначе он не будет называться.

DerekT-P

Я подозреваю, что вам не хватает Autopostback="true" для элементов управления, которые вы хотите отправить обратно. С этим набором на соответствующих элементах управления вам не понадобится Ваш OnClick="[что угодно]"
С autopostback вы больше не указываете явно, какой серверный метод вы хотите вызвать, поэтому вам нужно объявить это каким-то другим способом. Самое простое-включить AutoEventWireup=true в объявление страницы (в файле .aspx). Потом жерех.Net свяжет методы с именами по умолчанию ([control]_[event]) с обратными связями ваших элементов управления. Кроме того, вы можете добавить отображение явно на стороне сервера, добавив "handles [control].[событие]" к вашим определениям методов; например

Sub mypanel_hasbeenclicked(sender as Object, e as EventArgs) обрабатывает панель Panel1.Щелчок

Просто убедитесь, что вы не используете оба метода одновременно, иначе вы можете вызвать свои методы дважды (если они имеют имена по умолчанию)
Я также предлагаю вам исследовать, что на самом деле происходит, когда вы нажимаете кнопку; в Chrome используйте панель "сеть" инструментов разработчика для мониторинга запросов к серверу - это покажет вам фактические данные, отправляемые на сервер. В вашем коде C# установите точки останова в page_load и других обработчиках событий, чтобы вы могли понять последовательность событий на сервере.

Member 14192762

Спасибо за ваш комментарий. Наконец, я понял причину. Это было потому, что у меня было два тега формы на моей главной странице по ошибке.

0 Ответов