5 // Atsushi Enomoto <atsushi@ximian.com>
7 // Copyright (C) 2008 Novell, Inc http://novell.com
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System.Collections;
33 using System.ComponentModel;
34 using System.Security.Permissions;
36 using System.Web.DynamicData;
39 namespace System.Web.UI.WebControls
41 // [ToolboxBitmap (typeof (LinqDataSource), "LinqDataSource.ico")]
42 [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
43 [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
44 [ParseChildren (true)]
45 [PersistChildren (false)]
46 public class LinqDataSource : DataSourceControl, IDynamicDataSource
48 static readonly string [] empty_names = new string [] { "DefaultView" };
50 public LinqDataSource ()
54 protected internal override void OnInit (EventArgs e)
56 Page.LoadComplete += OnPageLoadComplete;
59 void OnPageLoadComplete (object sender, EventArgs e)
61 SelectParameters.UpdateValues (Context, this);
62 WhereParameters.UpdateValues (Context, this);
63 GroupByParameters.UpdateValues (Context, this);
64 OrderByParameters.UpdateValues (Context, this);
65 OrderGroupsByParameters.UpdateValues (Context, this);
68 protected internal override void OnUnload (EventArgs e)
72 // no further things to do?
77 LinqDataSourceView view;
78 LinqDataSourceView View {
82 if (IsTrackingViewState)
83 ((IStateManager) view).TrackViewState ();
89 protected virtual LinqDataSourceView CreateView ()
91 var view = new LinqDataSourceView (this, Guid.NewGuid ().ToString (), HttpContext.Current);
92 if (IsTrackingViewState)
93 ((IStateManager) view).TrackViewState ();
97 protected override DataSourceView GetView (string viewName)
99 if (String.IsNullOrEmpty (viewName) || (String.Compare (viewName, empty_names [0], StringComparison.InvariantCultureIgnoreCase) == 0))
101 throw new ArgumentException ("viewName must be 'DefaultView' in LinqDataSource");
104 protected override ICollection GetViewNames ()
111 [Category ("Behavior")]
112 [DefaultValue (false)]
113 public bool AutoGenerateOrderByClause {
114 get { return View.AutoGenerateOrderByClause; }
115 set { View.AutoGenerateOrderByClause = value; }
118 [Category ("Behavior")]
119 [DefaultValue (false)]
120 public bool AutoGenerateWhereClause {
121 get { return View.AutoGenerateWhereClause; }
122 set { View.AutoGenerateWhereClause = value; }
125 [Category ("Behavior")]
126 [DefaultValue (true)]
127 public bool AutoPage {
128 get { return View.AutoPage; }
129 set { View.AutoPage = value; }
132 [Category ("Behavior")]
133 [DefaultValue (true)]
134 public bool AutoSort {
135 get { return View.AutoSort; }
136 set { View.AutoSort = value; }
141 public string ContextTypeName { get; set; }
145 [MonoTODO ("looks like we need System.Web.Query.Dynamic stuff or alternative")]
146 Type IDynamicDataSource.ContextType {
148 if (context_type != null && context_type.FullName == ContextTypeName)
151 if (String.IsNullOrEmpty (ContextTypeName))
152 throw new ArgumentException ("ContextTypeName is not set");
153 // FIXME: retrieve type from BuildProvider or whatever.
154 context_type = LoadType (ContextTypeName);
155 if (context_type == null)
156 throw new ArgumentException (String.Format ("Type '{0}' cannot be loaded", ContextTypeName));
161 throw new ArgumentNullException ("value");
162 context_type = value;
163 ContextTypeName = context_type.FullName;
167 private Type LoadType (string name)
169 foreach (var ass in AppDomain.CurrentDomain.GetAssemblies ())
170 foreach (var type in ass.GetTypes ())
171 if (type.FullName == name)
176 string IDynamicDataSource.EntitySetName {
177 get { return TableName; }
178 set { TableName = value; }
183 public string TableName {
184 get { return View.TableName; }
185 set { View.TableName = value; }
188 [Category ("Behavior")]
189 [DefaultValue (false)]
190 public bool EnableDelete {
191 get { return View.EnableDelete; }
192 set { View.EnableDelete = value; }
195 [Category ("Behavior")]
196 [DefaultValue (false)]
197 public bool EnableInsert {
198 get { return View.EnableInsert; }
199 set { View.EnableInsert = value; }
202 [Category ("Behavior")]
203 [DefaultValue (false)]
204 public bool EnableObjectTracking {
205 get { return View.EnableObjectTracking; }
206 set { View.EnableObjectTracking = value; }
209 [Category ("Behavior")]
210 [DefaultValue (false)]
211 public bool EnableUpdate {
212 get { return View.EnableUpdate; }
213 set { View.EnableUpdate = value; }
218 public string GroupBy {
219 get { return View.GroupBy; }
220 set { View.GroupBy = value; }
225 public string OrderBy {
226 get { return View.OrderBy; }
227 set { View.OrderBy = value; }
232 public string OrderGroupsBy {
233 get { return View.OrderGroupsBy; }
234 set { View.OrderGroupsBy = value; }
239 public string Select {
240 get { return View.SelectNew; }
241 set { View.SelectNew = value; }
246 public string Where {
247 get { return View.Where; }
248 set { View.Where = value; }
251 [MergableProperty (false)]
253 [DefaultValue (null)]
254 [PersistenceMode (PersistenceMode.InnerProperty)]
256 public ParameterCollection SelectParameters {
257 get { return View.SelectNewParameters; }
260 [MergableProperty (false)]
262 [DefaultValue (null)]
264 [PersistenceMode (PersistenceMode.InnerProperty)]
265 public ParameterCollection WhereParameters {
266 get { return View.WhereParameters; }
269 [MergableProperty (false)]
271 [DefaultValue (null)]
273 [PersistenceMode (PersistenceMode.InnerProperty)]
274 public ParameterCollection GroupByParameters {
275 get { return View.GroupByParameters; }
278 [MergableProperty (false)]
280 [DefaultValue (null)]
282 [PersistenceMode (PersistenceMode.InnerProperty)]
283 public ParameterCollection OrderByParameters {
284 get { return View.OrderByParameters; }
287 [MergableProperty (false)]
289 [DefaultValue (null)]
290 [PersistenceMode (PersistenceMode.InnerProperty)]
292 public ParameterCollection OrderGroupsByParameters {
293 get { return View.OrderGroupsByParameters; }
296 [MergableProperty (false)]
298 [DefaultValue (null)]
299 [PersistenceMode (PersistenceMode.InnerProperty)]
301 public ParameterCollection DeleteParameters {
302 get { return View.DeleteParameters; }
305 [MergableProperty (false)]
307 [DefaultValue (null)]
308 [PersistenceMode (PersistenceMode.InnerProperty)]
310 public ParameterCollection InsertParameters {
311 get { return View.InsertParameters; }
314 [MergableProperty (false)]
316 [DefaultValue (null)]
317 [PersistenceMode (PersistenceMode.InnerProperty)]
319 public ParameterCollection UpdateParameters {
320 get { return View.UpdateParameters; }
323 public int Delete (IDictionary keys, IDictionary oldValues)
325 return View.Delete (keys, oldValues);
328 public int Insert (IDictionary values)
330 return View.Insert (values);
333 public int Update (IDictionary keys, IDictionary values, IDictionary oldValues)
335 return View.Update (keys, values, oldValues);
340 [Category ("Behavior")]
341 [DefaultValue (true)]
342 public bool StoreOriginalValuesInViewState {
343 get { return View.StoreOriginalValuesInViewState; }
344 set { View.StoreOriginalValuesInViewState = value; }
347 protected override void LoadViewState (object savedState)
349 Pair p = savedState as Pair;
351 base.LoadViewState (p.First);
352 ((IStateManager) View).LoadViewState (p.Second);
356 protected override object SaveViewState ()
358 object me = base.SaveViewState (), view = ((IStateManager) View).SaveViewState ();
359 if (me != null || view != null)
360 return new Pair (me, view);
365 protected override void TrackViewState ()
367 base.TrackViewState ();
369 ((IStateManager) view).TrackViewState ();
374 #region Events (Dispatching)
376 public event EventHandler<LinqDataSourceStatusEventArgs> ContextCreated {
377 add { View.ContextCreated += value; }
378 remove { View.ContextCreated -= value; }
381 public event EventHandler<LinqDataSourceContextEventArgs> ContextCreating {
382 add { View.ContextCreating += value; }
383 remove { View.ContextCreating -= value; }
386 public event EventHandler<LinqDataSourceDisposeEventArgs> ContextDisposing {
387 add { View.ContextDisposing += value; }
388 remove { View.ContextDisposing -= value; }
391 public event EventHandler<LinqDataSourceStatusEventArgs> Deleted {
392 add { View.Deleted += value; }
393 remove { View.Deleted -= value; }
396 public event EventHandler<LinqDataSourceDeleteEventArgs> Deleting {
397 add { View.Deleting += value; }
398 remove { View.Deleting -= value; }
401 event EventHandler<DynamicValidatorEventArgs> IDynamicDataSource.Exception {
402 add { View.Exception += value; }
403 remove { View.Exception -= value; }
406 public event EventHandler<LinqDataSourceStatusEventArgs> Inserted {
407 add { View.Inserted += value; }
408 remove { View.Inserted -= value; }
411 public event EventHandler<LinqDataSourceInsertEventArgs> Inserting {
412 add { View.Inserting += value; }
413 remove { View.Inserting -= value; }
416 public event EventHandler<LinqDataSourceStatusEventArgs> Selected {
417 add { View.Selected += value; }
418 remove { View.Selected -= value; }
421 public event EventHandler<LinqDataSourceSelectEventArgs> Selecting {
422 add { View.Selecting += value; }
423 remove { View.Selecting -= value; }
426 public event EventHandler<LinqDataSourceStatusEventArgs> Updated {
427 add { View.Updated += value; }
428 remove { View.Updated -= value; }
431 public event EventHandler<LinqDataSourceUpdateEventArgs> Updating {
432 add { View.Updating += value; }
433 remove { View.Updating -= value; }