ObjectDataSource SelectMethod中的访问控制
本文关键字:访问控制 SelectMethod ObjectDataSource | 更新日期: 2023-09-27 18:20:32
考虑以下使用ObjectDataSource填充GridView:的Webforms代码
默认.aspx
<asp:GridView ID="GV" DataSourceID="ODS" runat="server"/>
<asp:ObjectDataSource ID="ODS" TypeName="WebApplication.Default" SelectMethod="GetModels" runat="server" />
<asp:Label ID="Label" runat="server"/>
默认.aspx.cs
private static readonly List<Model> Models;
static Default()
{
Models = new List<Model>
{
new Model {Id = 1, Name = "Foo"},
new Model {Id = 2, Name = "Bar"},
new Model {Id = 3, Name = "Foo"},
new Model {Id = 4, Name = "Bar"}
};
}
public List<Model> GetModels()
{
var listsizeCap = 3;
var totalCount = Models.Count;
if (totalCount > listsizeCap)
{
// Label is null!
Label.Text = string.Format("The grid only shows the first {0} results of a total of {1}", listsizeCap, totalCount);
}
return Models.Take(listsizeCap).ToList();
}
我需要限制数据源返回的项目数,并向Label显示有多少项目被限制。
但是,当我到达GetModels
方法时,Label
为空。
知道我如何在ObjectDataSource选择方法中设置控件的值吗?
您在谈论对数据源进行分页吗?如果是这种情况,你可以直接使用
EnablePaging=";真";
SelectCountMethod="
您在此处声明的方法将返回此方法应返回的总记录。您需要自己编写这个方法,但它应该与您的select方法相同。然后你可以使用:
MaximumRowsParameterName="
StartRowIndexParameterName=""
ObjectDataSource的select方法将使用这些参数作为它的最后两个参数。如果您在ObjectDataSource中声明变量,请不要实际添加它们,这将自动传递。将您在此处设置的名称添加到实际方法减速度中。您将根据这些值根据页面调整您的选择代码。
编辑:为了完整起见,保留上面的项目。这个问题的答案应该如下。
如果使用的是ObjectDataSource的分页方法,则不应尝试从select方法更改页面元素。您应该分离这个逻辑并依赖ObjectDataSource的onSelected方法。具体来说,您将获得您声明的SelectCountMethod的返回值。然后,您可以在代码隐藏页中添加这样的内容。
public int recordsReturned;
public int recordCount;
protected void nameOfYourOnSelectedMethod(object sender, ObjectDataSourceStatusEventArgs e)
{
// check if this call is from the Select or SelectCount method
if (e.ExecutingSelectCount) {
// logic here will be used for setting the label
recordCount = e.ReturnValue;
Label.Text = "The grid only shows the first " + recordsReturned.ToString() + " results of a total of " + recordCount.ToString();
}
else {
// logic here is to get the amount of records returned
// you just want to save the value here
recordsReturned = e.ReturnValue.Count();
}
我自己还没有试过这个代码,但它应该可以工作。
对于所有ASP.NET而言,ObjectDataSource
上的TypeName
属性指的是一个简单的POCO。在我的情况下,它恰好是Page
类。无论如何,ASP.NET调用GetModels
时不会进行任何页面硬连接,因此其他控件(如Label
)永远不会在后台初始化。
我通过在HttpContext.Current.Items
上添加临时状态找到了一个解决方案。
GetModels
变为:
public List<Model> GetModels()
{
var listsizeCap = 3;
var totalCount = Models.Count;
if (totalCount > listsizeCap)
{
HttpContext.Current.Items["LabelToSet"] = string.Format("The grid only shows the first {0} results of a total of {1}", listsizeCap, totalCount);
}
return Models.Take(listsizeCap).ToList();
}
Default.aspx更新为OnDataBound
事件:
<asp:GridView ID="GV" DataSourceID="ODS" OnDataBound="GV_DataBound" runat="server"/>
它从HttpContext
读取值并将其分配给Label
:
protected void GV_DataBound(object sender, EventArgs e)
{
Label.Text = HttpContext.Current.Items["LabelToSet"].ToString();
}