如何在ASP.NET

时间:2017-08-07 11:35:14

标签: c# asp.net

我正在动态创建一个数组,为某些数据的每个条目添加一行。每个条目都必须有一个按钮来完成它的一些操作,但我仍然坚持这一点。我有这段代码来创建 ASP.NET 按钮:

<asp:Button ID="buttonyes" class="buttonyes" CommandArgument='<%= request.ID %>' 
            CommandName="AcceptRequest" OnClick='<%= ButtonPressed %>' runat="server"/>

但是当我运行它时,我有多个错误说:

  

%=<>表达式无效。

当我点击按钮时,我想调用与 index.aspx 链接的 index.aspx.cs 文件中写的函数,这里是{{ 1}}函数和此函数中的过滤器,它选择应该执行的操作:

ButtonPressed

问题在于我没有成功将这些 C#变量作为protected void ButtonPressed(Object sender, CommandEventArgs e) { Button btn = (Button)sender; switch (btn.CommandName) { case "AcceptRequest": AcceptRequest(btn.CommandArgument.ToString()); break; case "RefuseRequest": RefuseRequest(btn.CommandArgument.ToString()); break; } } CommandArgument传递。

我已经尝试过这些语法,遵循以前的一些问题:

  • CommandName
  • CommandArgument="<%: request.ID %>"
  • CommandArgument='<%: request.ID %>'
  • CommandArgument="<%= request.ID %>"

但他们都没有工作。

编辑1:

如下所述@grek40CommandArgument='<%= request.ID %>'值应替换如下:

OnClick

编辑2:

我想知道如何传递C# 本地 变量,因为这些按钮应该添加到<asp:Button ID="buttonyes" class="buttonyes" CommandArgument='<%= request.ID %>' CommandName="AcceptRequest" OnCommand="ButtonPressed" runat="server"/> 循环中,如下所示:

foreach

顺便说一下,上面的代码不起作用,因为正如@Nino所说,这只适用于全局变量。

3 个答案:

答案 0 :(得分:3)

为什么不为自己省去很多麻烦并切换到强类型中继器控件。您可以使用ItemType属性使其安全。该值必须是类request

的完整命名空间

然后您仍然可以像现在一样访问这些属性。但是,您使用固定名称request

,而不是使用Item
<table border="1">
    <asp:Repeater ID="Repeater1" runat="server" ItemType="Namespace1.Default1.request">
        <ItemTemplate>
            <tr>
                <td><%# Item.applicant.Name + " (" + Item.applicant.ID + ")" %></td>
                <td><%# Item.software.Name %></td>
                <td><%# Item.date.ToLongDateString() %></td>
                <td class="actions">
                    <asp:Button ID="buttonyes" class="buttonyes" CommandName="AcceptRequest" CommandArgument='<%# Item.Id %>' OnCommand="ButtonPressed" runat="server" />
                    <asp:Button ID="buttonno" class="buttonno" CommandName="RefuseRequest" CommandArgument='<%# Item.Id %>' OnCommand="ButtonPressed" runat="server" />
                </td>
            </tr>
        </ItemTemplate>
    </asp:Repeater>
</table>

现在您可以使用正常的数据绑定方式:CommandArgument='<%# Item.Id %>'

在完整的测试代码下面......

public List<request> requests = new List<request>();

protected void Page_Load(object sender, EventArgs e)
{
    //create some dummy data
    for (int i = 0; i < 10; i++)
    {
        request r = new request() { Id = i, date = DateTime.Now };
        r.applicant = new applicant() { Name = "Applicant " + i, ID = 1 + 100 };
        r.software = new software() { Name = "Software " + i };
        requests.Add(r);
    }

    if (!Page.IsPostBack)
    {
        Repeater1.DataSource = requests;
        Repeater1.DataBind();
    }
}

public class request
{
    public int Id { get; set; }
    public DateTime date { get; set; }
    public applicant applicant { get; set; }
    public software software { get; set; }
}

public class applicant
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class software
{
    public int ID { get; set; }
    public string Name { get; set; }
}

答案 1 :(得分:2)

你可以这样做:

CommandArgument='<%# request.ID %>'

这种方式CommandArgument将在DataBidning阶段分配。

答案 2 :(得分:1)

我认为您的命令操作不正确。

大多数人可能会想到OnClick(),但您的方法签名与OnCommand()

相关联

改变
 OnClick='<%= ButtonPressed %>'

 OnCommand='<%= ButtonPressed %>'

OnClick签名是(object sender,EventArgs e)... OnCommand签名是(object sender,CommandEventArgs e)......并且预期的参数值应该是好的。

至于&#34; OnClick&#34;或者&#34; OnCommand&#34;,应该根据将处理呼叫的功能来修复,例如你的&#34; ButtonPressed&#34;方法。你不需要你的&#34;%&#34;包装器,因为函数没有改变...你的命令名称可以改变,但不能改变处理事件的方法......

 OnClick='ButtonPressed'