【问题标题】:Button, changing CommandName and CommandArgs on the client side按钮,在客户端更改 CommandName 和 CommandArgs
【发布时间】:2011-02-03 15:40:37
【问题描述】:

有没有办法在客户端更改这两个属性的值,并在回发后反映在服务器端。我试过了,但它似乎不起作用。我也想在我委托提交的页面上有一个按钮,并在客户端分配这两个参数。似乎不可能。有什么想法吗?

假设表单中有一个名为“cmd”的按钮

 <script type="text/javascript" language="javascript">
        $(document).ready(function () {
            $("#<%=cmd.ClientID %>").click(function () {
                $(this).attr("CommandName", "do").attr("CommandArgument", "arg2");
            });

        });

    </script>

如果在回发后检查值,它们仍与回发前相同。

【问题讨论】:

  • 您能否向我们展示您用来尝试实现此目的的代码示例? =)
  • @Rob:刚刚更新了代码示例
  • 您使用的是 .NET 4.0 吗?如果不是什么版本?

标签: asp.net


【解决方案1】:

我试过你的代码,它工作正常。

只需通过添加 OnClientClick="return false;" 来确保您的按钮没有生成回发:

  <asp:Button ID="cmd" runat="server" Text="Button" OnClientClick="return false;"></asp:Button>

此外,您不会在浏览器上看到“查看源代码”的差异。但是 DOM 已经发生了变化。使用 firebug 并添加 console.log 自己查看:

$("#<%=cmd.ClientID %>").click(function () {
    $(this).attr("CommandName", "do").attr("CommandArgument", "arg2");
    console.log(this);
});

console.log(this) 给了我以下信息:

编辑: 如果你考虑一下。如果按钮创建回发,那么一旦页面再次加载,按钮将自行重置为正常状态。

编辑 #2:

我不需要客户端上的更改 方面,我需要它在服务器端。 这就是重点 问题。我需要看到变化 服务器端,似乎没有 成为可能。 – 皮特卡

好吧...好吧,在那种情况下。这不可能。 “CommandArgument”和“CommandName”对客户端没有任何意义,也无法访问。

但是有一些变通方法。但是根据您的应用程序的上下文,它们可能对您没有用处。

您可以尝试使用自己的属性,如建议的答案here

或者您可以在客户端执行 __doPostBack 并在后面的代码中获取 __EVENTARGUMENT。

(链接按钮用于通过asp.net生成__doPostBack函数。)

像这样:

<script type="text/javascript" language="javascript">
    function DoPostBack() {
        __doPostBack('cmd', 'thesearemyarguments');

    }
</script>

页面:

<asp:Button ID="cmd" runat="server" Text="Button" 
        OnClientClick="DoPostBack(); return true;" 
        onclick="cmd_Click" ></asp:Button>


    <asp:LinkButton ID="LinkButton1" runat="server" Visible="false">LinkButton</asp:LinkButton>

代码背后:

protected void cmd_Click(object sender, EventArgs e)
{
    Response.Write(Request.Params["__EVENTARGUMENT"]);
}

【讨论】:

  • 我不需要在客户端进行更改,我需要在服务器端进行更改。这就是问题的全部意义所在。我需要在服务器端看到变化,似乎不可能。
【解决方案2】:

我在这里遇到了同样的问题,我发现解决方案是使用 ajax 调用将我的按钮 ID 发送到我可以将其设置为会话变量的函数。因为无法从静态调用中访问我想要更新的 asp 控件。 ajax 调用成功后,我单击一个隐藏按钮,该按钮使用非静态单击事件来操作我设置的会话变量并更新控件

我的链接是在转发器中生成的,它们对应于房子的不同房间。当您单击链接时,另一个中继器必须更新以显示与所单击房屋的房间相关的已售产品

从转发器生成的我的链接

<a href="#" class="changeroom" data-id="<%#Eval("NodeID")%>" data-toggle="tab"><%#Eval("DocumentName") %></a>

我的客户端方法

$('.changeroom').each(function () {
    $(this).on('click', function () {
        var id = $(this).attr('data-id');
        var object = { 'sender': id };

        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "/App/Page Templates/FindByRoom.aspx/UpdateRoomID",
            data: JSON.stringify(object),
            success: function() {
                $('#btnID').click();
            }
        });    
    });
});

btnID 是一个带有服务器端点击事件的简单 aspButton

最后是我的服务器端方法

protected void btnChangeRoom_OnClick(object sender, CommandEventArgs e)
{
    int id = 0;
    if (Session["RoomID"] == null) return;
    Int32.TryParse(Session["RoomID"].ToString(), out id);
    if (id == 0) return;
    //do something with your buttons id
    //i updated the path of a repeater and reloaded the data
}

[System.Web.Services.WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static void UpdateRoomID(string sender)
{
    HttpContext.Current.Session["RoomID"] = sender;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-03
    • 2014-11-16
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多