Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.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中将C#变量作为CommandArgument传递_C#_Asp.net - Fatal编程技术网

如何在ASP.NET中将C#变量作为CommandArgument传递

如何在ASP.NET中将C#变量作为CommandArgument传递,c#,asp.net,C#,Asp.net,我正在动态创建一个数组,为一些数据的每个条目添加一行。每个条目都必须有一个按钮来做一些事情,但我在这一点上卡住了。我有以下代码来创建ASP.NET按钮: 问题是我没有成功地将这些C变量作为CommandArgument和CommandName传递 我已经尝试过这些语法,下面是前面的一些问题: CommandArgument=”“ CommandArgument='' CommandArgument=”“ CommandArgument='' 但没有一个成功 编辑1: 如下所述,OnClick

我正在动态创建一个数组,为一些数据的每个条目添加一行。每个条目都必须有一个按钮来做一些事情,但我在这一点上卡住了。我有以下代码来创建ASP.NET按钮:

问题是我没有成功地将这些C变量作为
CommandArgument
CommandName
传递

我已经尝试过这些语法,下面是前面的一些问题:

  • CommandArgument=”“
  • CommandArgument=''
  • CommandArgument=”“
  • CommandArgument=''
但没有一个成功

编辑1:

如下所述,
OnClick
值应按如下方式替换:

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

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

您可以这样做:

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

这样,将在数据桥接阶段分配
CommandArgument

您可以这样做:

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

这样,将在数据桥接阶段分配
CommandArgument

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

大多数人可能认为OnClick(),但您的方法签名与OnCommand()相关联

 OnClick='<%= ButtonPressed %>'

我认为你的命令不正确

大多数人可能认为OnClick(),但您的方法签名与OnCommand()相关联

 OnClick='<%= ButtonPressed %>'

为什么不省去很多麻烦,改用强类型的中继器控件呢。您可以使用
ItemType
属性使其类型安全。该值必须是类
请求的完整命名空间

然后,您仍然可以像现在一样访问这些属性。但不是使用
请求
,而是使用
项的固定名称

<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=''

下面是测试的完整代码

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; }
}
公共列表请求=新列表();
受保护的无效页面加载(对象发送方、事件参数e)
{
//创建一些虚拟数据
对于(int i=0;i<10;i++)
{
请求r=newrequest(){Id=i,date=DateTime.Now};
r、 申请人=新申请人(){Name=“申请人”+i,ID=1+100};
r、 软件=新软件(){Name=“software”+i};
请求。添加(r);
}
如果(!Page.IsPostBack)
{
Repeater1.DataSource=请求;
Repeater1.DataBind();
}
}
公共类请求
{
公共int Id{get;set;}
公共日期时间日期{get;set;}
公共申请人{get;set;}
公共软件{get;set;}
}
公开课申请人
{
公共int ID{get;set;}
公共字符串名称{get;set;}
}
公共类软件
{
公共int ID{get;set;}
公共字符串名称{get;set;}
}

为什么不省去很多麻烦,改用强类型中继器控件呢。您可以使用
ItemType
属性使其类型安全。该值必须是类
请求的完整命名空间

然后,您仍然可以像现在一样访问这些属性。但不是使用
请求
,而是使用
项的固定名称

<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=''

下面是测试的完整代码

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; }
}
公共列表请求=新列表();
受保护的无效页面加载(对象发送方、事件参数e)
{
//创建一些虚拟数据
对于(int i=0;i<10;i++)
{
请求r=newrequest(){Id=i,date=DateTime.Now};
r、 申请人=新申请人(){Name=“申请人”+i,ID=1+100};
r、 软件=新软件(){Name=“software”+i};
请求。添加(r);
}
如果(!Page.IsPostBack)
{
Repeater1.DataSource=请求;
Repeater1.DataBind();
}
}
公共类请求
{
公共int Id{get;set;}
公共日期时间日期{get;set;}
公共申请人{get;set;}
公共软件{get;set;}
}
公开课申请人
{
公共int ID{get;set;}
公共字符串名称{get;set;}
}
公共类软件
{
公共int ID{get;set;}
公共字符串名称{get;set;}
}

而不是
OnClick='
就我所知,它应该是
OnClick=“ButtonPressed”
试试这个
CommandArgument='
。你能准确地引用错误信息吗?正如grek40所说,就我所知,
OnClick
似乎是无效属性,而不是
CommandArgument
…它应该是
OnClick=“ButtonPressed”
,而不是
CommandArgument='
。你能准确地引用错误信息吗?正如grek40所说,
OnClick
似乎是无效属性,而不是
CommandArgument
…感谢您的回答,但当我尝试您的代码时,它会引发一个错误,表明
请求
值不存在。但这一行是在一个循环中调用的,它将显示我需要的所有按钮,我100%确定我的
请求
变量已声明。@Louis'LYRO'Dupont
请求
应在aspx/ascx范围内定义。如果
request
是局部变量,在某些方法中使用,那么这将不起作用。那么为什么不在代码中动态分配
CommandArgument
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; }
}