【问题标题】:Does not appear to be emitting correct GridView markup for __doPostBack似乎没有为 __doPostBack 发出正确的 GridView 标记
【发布时间】:2011-06-19 05:42:43
【问题描述】:

我向this question 询问了 ASP.Net 中 GridView 控件的奇怪行为(我使用的是 C#)。

对于我的 GridView 中的每一行,都有一个“编辑”和“删除”链接。例如,编辑有这个javascript:__doPostBack('gvwServers','Edit$0') - 所以很明显服务器会发现有人点击了0gvwServers 的编辑行。

很公平。如果我单击编辑链接,我会收到一个回发,并且 GridView 被重绘,编辑按钮被替换为“更新”和“取消”按钮。标准行为。现在 - “取消”按钮有这个链接 javascript:__doPostBack('gvwServers','Cancel$0') - 正是我所期望的取消行 0gvwServers。但是更新按钮有javascript:__doPostBack('gvwServers$ctl02$ctl00','')。这似乎没有任何意义。这似乎是我的例程处理更新未被触发的原因。

为什么 ASP 没有输出正确的回发参数?

我的代码可以在上面的链接中找到。

<asp:GridView ID="gvwServers" runat="server" class="gvwServers"  
AutoGenerateColumns="false"  OnRowEditing="gvwServers_Edit" 
onrowcancelingedit="gvwServers_Cancelling" onrowdeleting="gvwServers_Deleting" 
onrowupdated="gvwServers_Updated" onrowupdating="gvwServers_Updating"
AutoGenerateEditButton=true AutoGenerateDeleteButton=true>

<columns>
    <asp:CommandField  ShowEditButton="true" />
    <asp:CommandField  ShowDeleteButton="true" /> 
    <asp:BoundField DataField="intServerID" visible="false" />

    <asp:TemplateField HeaderText = "Server Name">
        <ItemTemplate>
            <asp:Label ID="lblServerName" runat="server" Text='<%# Bind("txtName") %>'></asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:TextBox ID="txtServerName_Edit" runat="server" Text='<%# Bind("txtName") %>'></asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField  HeaderText = "Key">
        <ItemTemplate>
            <asp:Label ID="lblAppKey" runat="server" Text='<%# Bind("txtApplicationKey") %>'></asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:TextBox ID="txtAppKey_Edit" runat="server" Text='<%# Bind("txtApplicationKey") %>'></asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField  HeaderText = "Connection String">
        <ItemTemplate>
            <asp:Label ID="lblConnString" runat="server" Text='************'></asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:TextBox runat="server" ID="txtConnString_Edit" Width="300px" Height="100px" Text='<%# Bind("txtConnectionString")%>' TextMode="MultiLine" ></asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateField>

</columns>
</asp:GridView> 

【问题讨论】:

  • 你能显示你所有的gridview代码吗? (上面的链接只显示编辑/删除)可能是一些简单的忽略。
  • @Wil 已更新标记

标签: c# asp.net gridview postback markup


【解决方案1】:

不确定您期望/不会发生什么。我拿走了您的 gridview 代码,并在另一个链接中使用了您的代码。我在每个处理程序中添加了一个 Response.Write,它似乎按预期运行。

public class Item
{
    public int intServerID { get; set; }
    public string txtName { get; set; }
    public string txtApplicationKey { get; set; }
    public string txtConnectionString { get; set; }
}

protected void Page_Load(object sender, EventArgs e)
{
    Item item = new Item();
    item.intServerID = 1;
    item.txtName = "Apple";
    item.txtApplicationKey = "Orange";
    item.txtConnectionString = "Test";

    List<Item> items = new List<Item>();
    items.Add(item);

    gvwServers.DataSource = items;
    gvwServers.DataBind();
}

protected void gvwServers_Edit(object sender, GridViewEditEventArgs e)
{
    Response.Write("Edit");
    gvwServers.EditIndex = e.NewEditIndex;
    gvwServers.DataBind();
}
protected void gvwServers_Updated(object sender, GridViewUpdatedEventArgs e)
{
    Response.Write("Updated");
    gvwServers.DataBind();
}

protected void gvwServers_Updating(object sender, GridViewUpdateEventArgs e)
{
    Response.Write("Updating");
    gvwServers.DataBind();
}
protected void gvwServers_Deleting(object sender, GridViewDeleteEventArgs e)
{
    Response.Write("Delete");
    gvwServers.DataBind();
}
protected void gvwServers_Cancelling(object sender, GridViewCancelEditEventArgs e)
{
    Response.Write("Cancel");

    e.Cancel = true;
    gvwServers.EditIndex = -1;
    gvwServers.DataBind();
}

【讨论】:

  • gvwServers_Updating 例程会触发吗?将鼠标悬停在更新按钮上时,您能看到 __doPostBack 参数是什么吗?
  • 我将这个答案标记为正确的原因(我认为)是填充数据网格的方法是正确的,即在Load 中 - 我在Init 中这样做。这一定是以某种方式破坏了处理程序关联。你能解释一下吗?
  • Init 仅在第一次加载时运行,而不是在任何后续回发时运行
  • @Wil 是的,我知道这就是我在初始化时填充数据网格的原因。它没有解释为什么它会破坏更新事件。我想可能是因为 __doPostBack 参数中引用的控件不再存在,因此无法定位或什么??
  • 跟asp.net的生命周期有关。如果您在 init 中再次加载网格,则无法访问视图状态,即告诉页面您处于编辑模式。
猜你喜欢
  • 2019-06-14
  • 1970-01-01
  • 2010-09-08
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多