Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ASP.NET WebForms中处理来自数据绑定控件的命令?_Asp.net_Webforms - Fatal编程技术网

如何在ASP.NET WebForms中处理来自数据绑定控件的命令?

如何在ASP.NET WebForms中处理来自数据绑定控件的命令?,asp.net,webforms,Asp.net,Webforms,这个问题似乎很简单,但我找不到答案。我肯定我错过了什么 我想使用一个数据绑定控件(比如ListView)和一个在项目模板内执行回发(按钮)的控件。我希望该按钮对此项中的数据执行一些操作 代码如下所示: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebFormListCommand.aspx.cs" Inherits="TestWebApplication.WebFormListCommand" %>

这个问题似乎很简单,但我找不到答案。我肯定我错过了什么

我想使用一个数据绑定控件(比如ListView)和一个在项目模板内执行回发(按钮)的控件。我希望该按钮对此项中的数据执行一些操作

代码如下所示:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebFormListCommand.aspx.cs"
    Inherits="TestWebApplication.WebFormListCommand" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ListView ID="lvTest" runat="server" EnableViewState="false" 
            onitemdatabound="lvTest_ItemDataBound" onitemcommand="lvTest_ItemCommand">
            <ItemTemplate>
                <br />
                <asp:Button ID="btnTest" runat="server" />
            </ItemTemplate>
        </asp:ListView>
    </div>
    </form>
</body>
</html>
问题是当按下按钮时,e.CommandArgument的值来自回发数据绑定。如果我在回发时不进行数据绑定,则根本不会引发事件。在大多数情况下,这不是问题,因为您将数据绑定到相同的数据。但是,如果一个用户删除了例如项目3,而第二个用户决定同时删除项目3,则第二个用户将实际删除第四个项目,因为这些项目将在回发时重新排序。如果启用了ViewState,则可以避免这种情况,但应该可以在没有ViewState的情况下执行命令(在所有应避免的一个位置ViewState都是数据绑定控件之后)。雪上加霜的是,我可以清楚地看到原始(正确)值已发布到服务器。它可以通过Request.Form[“lvTest$ctrl2$btnTest”]检索(键是触发回发的实际控件的唯一ID)

我尝试了很多方法将命令应用于正确的项,比如使用按钮单击代替项命令,使用数据键等。但是我无法获得数据项的正确值。数据绑定控件似乎总是使用行号来获取命令参数,而不是浏览器实际发布的值。我找到的唯一方法是手动查找Request.Form集合,但这似乎不正确。当然,我可以通过连接JavaScript函数和AJAX调用来解决这个问题,但我想知道如何用纯WebForms的方式解决这个问题。我错过了什么

  • 将代码从Page_Init移动到Page_Load

  • 点评

    lvTest.DataSource=可枚举范围(5,5)

    lvTest.DataBind()

  • 看看它是否有效

    我还可以声明性地设置
    CommandName
    并绑定
    comandargument
    属性,而不是将其设置为
    lvTest\u ItemDataBound

    更新:

  • 不要在回邮时重新绑定
  • 列表视图上启用viewstate
  • 标记:

    <div>
        <asp:ListView ID="lvTest" runat="server"
            onitemdatabound="lvTest_ItemDataBound" onitemcommand="lvTest_ItemCommand">
            <ItemTemplate>
                <br />
                <asp:Button ID="btnTest" runat="server" />
            </ItemTemplate>
        </asp:ListView>
    </div>
    <asp:Label Text="" ID="lblMessage" runat="server" />
    

    如果我在回发时注释掉数据绑定并禁用ViewState,则根本不会引发click事件。我在代码背后进行数据绑定,因为在ASP.NET 4.5之前,无法使用静态类型的声明性数据绑定,即通过Eval/Bind进行声明性数据绑定是有害的。但是,声明性数据绑定在这种情况下没有任何区别。它可以工作,因为ListView控件没有禁用其ViewState。如问题中所述,如果启用ViewState,一切正常,但不知何故,我不想为ListView和Grids启用ViewState,因为这正是应该禁用ViewState以防止页面大小增长的地方。@Stigar抱歉,没有看到该部分;我认为你是过早优化综合症的受害者。关闭绑定到重对象的网格和列表视图的视图状态不是过早优化。这是非常有意义的优化。目前我没有这个问题,我会用AJAX或者通过挖掘Request.Form值来解决,但是非常奇怪的是,没有ViewState,无法从列表中编写正常的delete。
    <div>
        <asp:ListView ID="lvTest" runat="server"
            onitemdatabound="lvTest_ItemDataBound" onitemcommand="lvTest_ItemCommand">
            <ItemTemplate>
                <br />
                <asp:Button ID="btnTest" runat="server" />
            </ItemTemplate>
        </asp:ListView>
    </div>
    <asp:Label Text="" ID="lblMessage" runat="server" />
    
        protected void Page_Init(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                lvTest.DataSource = Enumerable.Range(0, 5);
                lvTest.DataBind();
            }
            else
            {
                //lvTest.DataSource = Enumerable.Range(5, 5);
                //lvTest.DataBind();
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
    
        protected void lvTest_ItemDataBound(object sender, ListViewItemEventArgs e)
        {
            Button button = (Button)e.Item.FindControl("btnTest");
            int value = (int)e.Item.DataItem;
            button.CommandName = "someCommand";
            button.CommandArgument = value.ToString();
            button.Text = value.ToString();
        }
    
    
        protected void lvTest_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            //e.CommandArgument has the new value from the new databinding
            lblMessage.Text = e.CommandArgument.ToString();
        }