扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在本页阅读全文(共19页)
数据源控件需要使用参数值来指定需要选择哪些数据,或者指定如何修改数据以及修改什么数据。通常情况下,页面包含一些 UI,以定义那些必须在选择操作中使用的参数,而数据绑定控件提供了参数值来进行插入、更新和删除操作。但是,在任意一种情况下,都可能同时出现两种现象。
数据源控件揭示了 ZipCode 属性,该属性可进行声明性设置,或者以编码来设置以响应用户操作。参数被设计为以声明性(且可扩展)的方式来完成此方案。
引言
Parameter 基类代表一个通用参数。Microsoft Visual Studio 2005 提供了诸如 QueryStringParameter 之类的参数,以便将数据从查询字符串参数请求到数据源中。另一个非常有用的参数是 ControlParameter,该参数允许从任一控件属性中请求数据。如果内置参数类型不能满足您的要求,则您可以定义自己的参数类型。这样您就可以使页面与粘接代码不相关,而是将该代码整齐地封装在参数实现中。
除了从不同的源中请求值,这些参数还可以跟踪值的更改情况,并通知这些更改的所属数据源,进而引发数据源更改通知,最终在数据绑定控件中触发数据绑定操作。简而言之,这就是使用 ControlParameters 时,主要的声明性详细方案所依据的原理。
示例
在此将向 Weather Data Source 添加参数功能,然后进一步阐述。
public class WeatherDataSource : DataSourceControl { public static readonly string ZipCodeParameterName = "ZipCode"; ... private ParameterCollection _parameters; private ParameterCollection Parameters { get { if (_parameters == null) { _parameters = new ParameterCollection(); _parameters.ParametersChanged += new EventHandler(this.OnParametersChanged); if (IsTrackingViewState) { ((IStateManager)_parameters).TrackViewState(); } } return _parameters; } } ... public string GetSelectedZipCode() { if (_parameters != null) { Parameter zipCodeParameter = _parameters[ZipCodeParameterName]; if (zipCodeParameter != null) { IOrderedDictionary parameterValues = _parameters.GetValues(Context, this); return (string)parameterValues[zipCodeParameter.Name]; } } return ZipCode; } protected override void LoadViewState(object state) { object baseState = null; if (state != null) { Pair p = (Pair)state; baseState = p.First; if (p.Second != null) { ((IStateManager)Parameters).LoadViewState(p.Second); } } base.LoadViewState(baseState); } protected override void OnInit(EventArgs e) { Page.LoadComplete += new EventHandler(this.OnPageLoadComplete); } private void OnPageLoadComplete(object sender, EventArgs e) { if (_parameters != null) { _parameters.UpdateValues(Context, this); } } private void OnParametersChanged(object sender, EventArgs e) { CurrentConditionsView.RaiseChangedEvent(); } protected override object SaveViewState() { object baseState = base.SaveViewState(); object parameterState = null; if (_parameters != null) { parameterState = ((IStateManager)_parameters).SaveViewState(); } if ((baseState != null) || (parameterState != null)) { return new Pair(baseState, parameterState); } return null; } protected override void TrackViewState() { base.TrackViewState(); if (_parameters != null) { ((IStateManager)_parameters).TrackViewState(); } } } |
private sealed class WeatherDataSourceView : DataSourceView { ... internal Weather GetWeather() { string zipCode = _owner.GetSelectedZipCode(); if (zipCode.Length == 0) { return null; } WeatherService weatherService = new WeatherService(zipCode); return weatherService.GetWeather(); } } |
Zip Code: <asp:TextBox runat="server" id="zipCodeTextBox" /> <asp:Button runat="server" Text="查找" /> <hr /> <asp:FormView runat="server" DataSourceID="weatherDS"> <ItemTemplate> <asp:Label runat="server" Text='<%# Eval("Temperature", "当前温度是 {0}。") %>' /> </ItemTemplate> </asp:FormView> <nk:WeatherDataSource runat="server" id="weatherDS"> <Parameters> <asp:ControlParameter Name="ZipCode" ControlID="zipCodeTextBox" /> </Parameters> </nk:WeatherDataSource> |
请注意,在标记中并未指定 Text 作为在 ControlParameter 标记上查找的属性。ControlParameter 自动计算出了在未指定属性的情况下要使用的默认属性。它通过检查该类中的 ControlValueAttribute 来实现此目的。TextBox 将 Text 定义为包含其“控件值”的属性。除了传统输入控件之外,此概念还适用于多个控件。例如,GridView 将其 SelectedDataKey 揭示为“控件值”。这是一个新事物,控件开发人员从此以后应该予以考虑,以便与 ControlParameter 更好地进行集成。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者