Fixing an issue with output parameters that are of type IntPtr
[castle.git] / MonoRail / Changes.txt
blob676877a6e0f2179464b906ad2fb74120d6832cab
1 1.0\r
2 ===\r
3 \r
4 - Applied Aaron Jensen's adding call to RaiseUnhandledError when a controller fails to be created.\r
5 \r
6 - Applied Roger Chapman's patch adding the pascalcasetoword option to FormHelper.Select options dictionary. \r
7 \r
8 - Applied Dan Goldstein's patch fixing MR-346\r
9   "FormHelper's disablevalidation parameter only works when in Push command and on field"\r
11 - Fixed MR-409\r
12   Introduced IMonoRailContainerEvents and IMonoRailConfigurationEvents that might be implemented by the\r
13   HttpApplication subclass\r
15 - Fixed MR-412\r
16   "When applying a layout attribute over an Action, layout doesn't render for the rendered view."\r
18 - Applied James Curran's patch fixing MR-391\r
19   "ViewComponentDetailsAttribute use could lead to duplicate names."\r
21 - Applied Mike Nichols' patch fixing MR-392\r
22   "FormHelper.LiteralFor feature addition"\r
24 - Applied Alwin's patch fixing MR-398\r
25   "Could not save <model>. Ambiguous match found. (AmbiguousMatchException \r
26    when using Scaffolding and ActiveRecordValidationBase<T>)"\r
28 - Applied James Curran's patch fixing MR-419\r
29   "Improving initializing Service Enabled Components"\r
31 - Added FormHelper.TextFieldAutoComplete for combining AJAX AutoCompletion and FormHelper's round trip\r
32   support.\r
34 - Added possibility to create labels in CheckboxLists.\r
36 - Applied James Curran's patch fixing MR-390\r
37   "Adding AbstractHelper(IEngineContext) ctor"\r
39 - Applied Gauthier Segay's patch fixing MR-388 \r
40   "There should be a way to preserve url query string arguments while using DiggStylePagination" \r
42 - Applied Mike Nichols' patch adding two more events to the extension manager.\r
44 - Applied Felix Gartsman's patch fixing MR-387\r
45   "ViewComponent selective caching"\r
47 - Applied Felix Gartsman's patch fixing MR-368\r
48   "Added DetachedCriteria support to ARPaginationHelper/ARPaginableCriteria"\r
50 - Applied Gauthier Segay's patch fixing MR-384\r
51   "GenericCustomPage<T> should rely on IEnumerable<T> instead of IList<T> for it's datasource"\r
53 - Applied James Curran's patch fixing MR-347\r
54   "Cannot specify a default value for ViewComponentParameterAttribute"\r
56 - Applied Adam Tybor's patch fixing MR-370\r
57   "RouteContext and Http Method Filtering for PatternRule"\r
59 - Applied Daniel Jin's patch fixing MR-372\r
60   "add monorail configuration section to set the useExtensions option on DefaultUrlBuilder"\r
62 - Fixed MR-84\r
63   "Nested classes are mapped wrongly to form fields"\r
65 - Applied Kode Khan's patch changing logger creation to use type instead of controller's name\r
67 - Implemented support for view component caching. Just use the attribute \r
68   ViewComponentDetails and its properties (cache, cachekeygenerator)\r
70 - Applied Michael Sanford's patch which adds image button support to FormHelper.\r
72 - Applied Rafael Teixeira's patch fixing MR-357\r
73   "ViewEngineBase.IsTemplateForJSGeneration(String templateName) returns \r
74    true for a templateName with an incorrect extension"\r
76 - Added support for Composite Key in Formhelper select\r
78 - Applied Chris Ortman's patch with changes for the REST support (MR-333)\r
80 - Applied Nick Hemsley's patch adding support for rescue controllers (MR-332)\r
81   "add RescueController to RescueAttribute"\r
83 - Applied suggestion by Daniel D to fix MR-329\r
84   "Impossible to Context.Response.Redirect to any controller in empty Area from controller placed in some Area."\r
86 - Applied minor patch by Ken Egozi fixing MR-328\r
87   "In PrototypeWebValidation, SameAsValidator and NotSameAsValidator \r
88    are forcing a locase id for text fields"\r
90 - Applied minor patch by Nick Hemsley fixing MR-325\r
91   "DictHelper.FromNameValueCollection: persist arrays correctly"\r
93 - Added LocalExceptionFilterHandler\r
95 - Applied Robert Ream's patch which allows [DefaultAction] to be applied to Actions. This means that no strings are required. \r
97 - BaseControllerTest supports the ContextInitializer delegate, which makes it easier to modify the MockRailsEngineContext\r
99 Release Candidate 3\r
100 ===================\r
102 - Added IDisposable/Dispose back to the controller\r
104 - Applied Lee Henson's patch adding generic overloads to ReflectionHelper\r
106 - Added a few more RenderView overloads that take a mimeType to configure the Response.ContentType\r
108 - If the controller cannot be found, MR searches for a special rescue "rescues/404" before throwing throwing an exception.\r
110 - If an action could not be found, we go through normal path an use a general rescue if it can be found for the controller. \r
112 - UrlHelper change: Now if the param encode wasn't set, UrlHelper assumes it's true.\r
114 - Applied patch by Oleg Snurnikov fixing MR-319\r
115   "MockResponse - basic implementation of Redirect, Write, BinaryWrite and Clear overloads"\r
117 - Applied patch by Chirs Ortman fixing MR-296\r
118   "Dont get validation summary when binding with AR attribute but controller inherits smart dispatcher controller"\r
120 - Applied patch by Rafael Teixeira fixing MR-298\r
121   "ColumnRenderer with an empty enumeration still renders table start and end sections"\r
123 - Fixed MR-300\r
124   "DataBindAttribute in a ARSmartDispatcherController inherit the behavior from ARDataBinder"\r
126 - Applied minor patch by James Su fixing MR-303\r
127   "Behavior is not consistent between FormToAttributed and LinkToAttributed in HtmlHelper"\r
129 - Applied goodwill's patch adding cookie support to BaseControllerTest MR-304\r
131 - Applied goodwill's patch fixing MR-305\r
132   "fValidate fix a bug on unassociated label for element"\r
134 - Applied Oleg Snurnikov's patch fixing MR-306\r
135   "PrototypeWebValidator - regular expression validation"\r
137 - Fixed MR-311 \r
138   "The '\' character in templates goes unescaped when processed via NJS"\r
140 - The DefaultUrlBuilder now accepts a basePath parameter, which basically overrides the path information.\r
142 - Fixed MR-317\r
143   "ARDataBind handles BelongsTo attribute in Nested component incorrectly."\r
145 - FlashBinderAttribute was removed as I doesnt work with the new \r
146   MonoRail design (changed to make the cache support work)\r
148 - Applied Tim Haines' patch adding TextAreaValue to FormHelper \r
150 - Fixed MR-281 \r
151   "View components params problem"\r
153 - Applied Markus Zywitza's patch adding a Fold method to TextHelper. \r
154   His description "Shortens a text to the specified length (using full words only and\r
155 adding an ellipsis at the end) and wraps it into a span-element that\r
156 has the title-property with the full text associated. This is\r
157 convenient for displaying properties in tables that might have very\r
158 much content (desription fields etc.) without destroying the table's\r
159 layout. Due to the title-property of the surrounding span-element, the\r
160 full text is displayed in the browser while hovering over the\r
161 shortened text."\r
163 - Applied Aaron Jensen's patch fixing MR-288\r
164   "ApplicationPhysicalPath returns request path instead of / path"\r
166 - Fixed MR-284\r
167   "MockServerUtility.MapPath throws NotImplementedException"\r
169 - Applied Bill Pierce's patch fixing MR-278\r
170   "Add UrlDecode to IServerUtility"\r
172 - Applied Bryan Brown's patch fixing MR-273. This one adds a new attribute to \r
173   the routing configuration node: 'excludeAppPath'\r
174   "Automatically handle ApplicationPath in the routing module"\r
176 - Applied goodwill's patch fixing MR-275\r
177   "DefaultRailsEngineContext triggers RTE on ApplicationPhysicalPath \r
178    when running under ASPX Dev Server with virtual directory"\r
180 - Changed the BaseControllerTest vdir to "" instead "/"\r
182 - Added the Declare(String variable) to IJSGenerator inteface\r
184 - Applied Tim Haines' patch changing FormHelper to make calls to FormatIfNecessary \r
186 - Applied chris ortman's patch fixing MR-271\r
187   "AdditionalSources not loaded when using the viewEngines element"\r
189 - Applied Ricardo Stuven's patch fixing MR-258\r
190   "JSON serialization in Ajax calls"\r
192 - Applied goodwill's patch fixing MR-212\r
193   "Script Helpers (e.g. $Scriptaculous) installscript function clear flash unexpected"\r
195 - Applied Georges Benatti's patch \r
196   adding the attribute matchHostNameAndPath to the routing node on the configuration. \r
197   \r
198   If set to 'true', the regular expression is matched against the whole url. Defaults to 'false'\r
200 - Added ability to customise Next/Prev links in DiggStylePagination.\r
201    Patch from Markus Zywitza.\r
203 - Applied Mathias Doenitz's patch fixing MR-265\r
204   "(Re)enable initialization of Controller.AreaName, Controller.Name and Controller.Action before invoking Controller.Initialize()."\r
206 - Applied Adam Tybor's patch fixing MR-266\r
207   "Fix for GetErrorSummary() throwing an KeyNotFoundException for SmartDispatch Controller and Binder"\r
209 - Fixed MR-260\r
210   "PropertyBag in WizardStep is null when access via key"\r
212 - Applied Kyle Marshall's patch fixing MR-261\r
213   "The default ValidatorRegistry is not overriddable in the monorail configuration"\r
215 - Add support to BaseControllerTest (well MockRequest actually) for Mocking Url Referer. Patch from Colin Ramsay. \r
217 - Fix SupportsSection implementation in ViewComponent (was comparing section name equality against StringComparer.InvariantCultureIgnoreCase). \r
218   Also add a SupportsSection implementation to DiggStylePagination. Patches from Tim Haines. \r
220 - Small change to DiggStylePagination to allow supplying querystring parameters in the url. Suggested by kalle.stenflo@gmail.com.\r
222 - Applied Tim Haines' patch adding BindObject overloads that accept the AutoLoadBehavior enum, \r
223   to the ARSmartDispatcherController \r
225 - Changes from Lee Henson to add WizardStep support to TestSupport and provide a Generic BaseControllerTest. \r
227 - Patch from Maruis Marais allowing BuildFormRemoteTag to gracefully degrade when JavaScript is disabled. \r
229 - Patch from Lee Henson fixing regression introduced in 3783 in Prototype Validator. (Could not use hyphens in element id's). \r
231 - Fixed MR-241 \r
232   "When Windsor integration is enabled, the ControllerTree is empty"\r
234 - Apply patches from Tim Haynes. \r
235   "add a renderIfOnlyOnePage property to the DiggStylePagination View Component"\r
236   "Add NewRootInstanceIfInvalidKey AutoloadBehaviour to Castle.MonoRail.ActiveRecordSupport"\r
238 - Applied Goodwill's patch adding PersisteFlashFilter and the fValidate's localization support. Fixed MR-246.\r
240 - Fixed the use of Scaffolding without Layouts (MR-251).\r
242 - Added support for eager fetching of lazy collections, in [ARFetch] attribute.\r
244 - Added support for auto load bevahior configuration when invokling the BindObject in the   ARSmartDispatcherController\r
246 - Added support for different access and naming strategies in the ARDatabind attribute.\r
248 - Applied Matt Berther's patch adding LoggingExceptionHandler and FilteredExceptionHandler.\r
250 - Applied chris ortman's patch fixing MR-242\r
251   "FormHelper.LabelFor does not generate valid HTML when attributes are supplied"\r
253 - Applied bonskijr's patch fixing MR-234\r
254   "Under some circunstances ColumnRenderer generates invalid html"\r
256 - Applied Marc-André's patch fixing MR-238\r
257   "HtmlHelper.LinkTo: bugs- don't function when existing a area"\r
259 - Applied Aaron Jensen's patch fixing the Resource Manager usage \r
260   Changed from ResourceSet to ResourceManager\r
262 - Applied Lee Henson's patch adding the 'onCreateAdvice'\r
263   to PrototypeWebValidator\r
265 - Applied Chris Ortman's patch fixing MR-235\r
266   "Allow overriding of select generation in FormHelper"\r
268 - Added Item(string id) overload to Checkboxlist\r
269   Used to generate a checkbox with the specified id. Useful to label for='id' constructions\r
271 - Added the Expect property to the ARDataBindAttr. Now it will clear the collections \r
272   that are declared as expected, if not can be found on the resquest params. (MR-163)\r
274 - Applied Colin Ramsay's patch fixing MR-232\r
275   "HtmlHelper.InputButton should create <button> not <input type="button">"\r
277 - Fixed MR-228\r
278   "incorrect component configuration results in an 'The container seems to be unavailable \r
279    in your HttpApplication subclass' exception"\r
281 - Applied Bart Reyserhove's patch fixing MR-226 \r
282   "ARDataBinder has problems when using generic collections"\r
284 - Applied Jacob Lewallen's patch adding a new attribute (ViewComponentAttribute) used\r
285   to name view components. The behavior is changed to strip the 'Component' suffix from the class name as well.\r
287 - Applied Ernst Naezer's patch fixing MR-191\r
288   "Add TransformFilter support to MR"\r
290 - Applied Lee Henson's patch fixing MR-222\r
291   "Use of IRailsEngineContext.Items"\r
293 - Fixed MR-224\r
294   "ARDataBindAttribute does not set the Controllers validator on it's DataBinder"\r
296 - Fixed MR-219\r
297   "FormHelper.Select with an interface datasource throws an Object mismatch exception."\r
299 - Applied chris ortman's patch fixing MR-188\r
300   "Allow the #component directive to support variables for the component name"\r
302 - Fixed MR-208\r
303   "Using a lazy loaded nested object, "Ambiguous match found" exception occures when \r
304    trying to use FormHelper to render control for the nested objects property."\r
306 - Applied goodwill's patch fixing MR-213\r
307   "DiggStylePagination has a typo which prevents the code from build"\r
309 - Applied Edward Kreis' patch fixing MR-214\r
310   "ARDataBinding and joined subclasses with derived BelongsTo, HasMany, HasAndBelongsToMany proeprties"\r
312 - Fixed MR-217 \r
313   "fValidate box message contains <BR/> if being triggered twice"\r
315 - Fixed MR-221\r
316   "HtmlHelper.LinkToAttributed bug"\r
318 - Applied Jacob Lewallen's patch adding an optional attribute to define a view component's name\r
319   The patch also introduces a IViewComponentTree.\r
321 - Added 'noaction' parameter to FormHelper.FormTag to prevent action attribute generation\r
323 - Added Select list from Enum.\r
325         in controller:\r
326                 PropertyBag.Add("colors",Enum.GetValues(typeof(ColorEnum)));\r
328         in view:\r
329                 $Form.Select("Color", $colors)\r
331 - Applied Chris Ortman's patch adding MooHelper/JS generation based on it.\r
333 - Applied Jacob Lewallen's patch adding virtuals to some FormHelper methods\r
335 - Applied Patrick McEvoy's patch with a new approach to delete cookies\r
337 - Added \r
339         SmartDispatcherController.ValidationSummaryPerInstance : IDictionary\r
340         SmartDispatcherController.GetErrorSummary(object instance) : ErrorSummary\r
341         SmartDispatcherController.HasValidationError(object instance) : bool\r
342         \r
343   Those can be used if DataBinder is configured to validate\r
345 - Added Controller.RedirectToReferer\r
347 - Configuration changed, added defaultUrls section (see monorail_configuration_ref.txt)\r
349 - Added Controller.RenderMailMessage(string templateName, bool doNotApplyLayout) overload\r
351 - Added static accessor support to NVelocity view engine. Default helpers are \r
352   the Common System Types in dotnet (i.e. Double, String, Decimal, etc.)\r
353   \r
354     In your template: $String.Concat("foo","bar","me","please:",$Double.Epsilon)\r
355     (dotnet 2 only.)\r
357 - Added better ControllerBinder support for indexed property expressions.\r
358    This allows you to pass DataKeys as your action arguments\r
360 - Applied Freyr Magnússon's patch fixing MR-206 \r
361   "ARBadaBinder does not resolve primary key for discriminator subclass from parent"\r
363 - Retrieve target properties on demand for ControllerBinders ActionArgument editor\r
365 - Added ControllerBinder Extender Control for WebForm views to eliminate the\r
366    need to add event handlers in the codebehind that call Controller.Send\r
368 - Brail now has Ruby's like symbols, using @symbol.\r
369     For instance, component DiggStylePagination, ${ @useInlineStyle : true }\r
370         \r
371 - Brail can now accept " inside a ${ }, which used to break the parser previously.\r
373 - Added IViewComponentContext.RenderView(name, textwriter)\r
375 - Fixed MR-201\r
376   "DiggStylePagination.Initialize() doesn't check useInlineStyle parameter"\r
378 - Added FormHelper.HiddenField("key", value) overload\r
380 - Added 'valueformat' to SetOperations (affects FormHelper.Select, Checkboxlist)\r
382 - Fixed MR-197\r
383   "Exception thrown by AccessibleThrough are not caught by rescues"\r
385 - Added 'textformat' support to the all FormHelper operations (that create input elements).\r
387 - Added BrailJS Support, allowing to generate javascript via brail scripts.\r
388  Note; BrailJS scripts do not need <?brail ?> and any output statements there will be ignored.\r
389   They are used strictly to create the generator.\r
391 - Changed Brail extention from Boo to Brail / BrailJS\r
393 - Added mask support to FormHelper field elements\r
395 - Added FormHelper.PasswordNumberField\r
397 - Refactored FormHelper to support other approaches to extract values from instance.\r
398   Now it supports DataRows, DataRowViews and reflection\r
400 - Added ColumnRenderer view component\r
402 - Added DiggStylePagination ViewComponent, based on Alex Henderson work. \r
403   See http://blog.bittercoder.com/PermaLink,guid,579711a8-0b16-481b-b52b-ebdfa1a7e225.aspx\r
405 - Added PaginationHelper.CreateCustomPage\r
406   \r
407   This is only useful if the application code takes care of slicing (select top and etc)\r
409 - Added formatting support to SetOperations (affects FormHelper.Select, Checkboxlist)\r
410   \r
411   Example:\r
412   \r
413   $Form.Select("price", [1..100], "%{textformat='C'}")\r
414   \r
415   This will render a select with options like\r
416   \r
417   <option value="1">$1.00</option>\r
418   <option value="2">$2.00</option>\r
419   <option value="3">$3.00</option>\r
420   ...\r
422 - Added ScriptaculousHelper, deprecated Effects2Helper\r
424 - Extract Behaviour related operations from AjaxHelper into BehaviourHelper\r
426 - Added BehaviourHelper\r
428 - Added UpdatePage and UpdatePageTag ViewComponents. Both allow you to have a "page"\r
429   which is a JS generator. It evaluates the view component body to generate the JS.\r
430   \r
431   Example:\r
432   \r
433 #blockcomponent(UpdatePageTag)\r
434 $page.el('products').style.bgcolor.set('"white"')\r
435 #end\r
438 #blockcomponent(UpdatePage)\r
439 $page.el('products').style.bgcolor.set('"white"')\r
440 #end\r
442 - Added FormHelper.NumberField() which renders a 'input text' with a javascript that\r
443   prevents chars other than numbers (and period) from being entered.\r
445         You can optionally pass an <c>exceptions</c> value through the dictionary.\r
446         It must be a comma separated list of chars that can be accepted on the field. \r
448 - Added FormHelper scripts:\r
450   View must use FormHelper.InstallScripts()\r
452 - Refactored generation of script blocks\r
454 - Created stub for UrlForHelper\r
456 - Helpers are added with a less verbose name \r
457   FormHelper and Form, AjaxHelper and Ajax are made available to the view\r
459 - Added AuthenticatedContent ViewComponent that allows context to be \r
460   render based on the user state (authenticated or anonymous)\r
462 - Removed CompositeViewEngine as it's useless now that we support multiple view engines\r
464 - Multiple view engine support:\r
465   Configuration schema changed, see monorail_configuration_ref.txt for more information\r
467 - Introduced IViewEngineManager that sits between the controller and the view engines\r
468   deciding which view engine will be used output the contents\r
470 - Applied patch by Luke Melia for MR-192: \r
471   "Add TextHelper"\r
473 - Introduced IPaginatedPage.HasPage(), useful for Google-like pagination.\r
475 - PaginationHelper.CreatePagination<T>() now accepts ICollection<T> as a parameter.\r
477 - New method PaginationHelper.CreatePageLinkWithCurrentQueryString().\r
478   Creates a page link, copying the current QueryString parameters as well.\r
480 - Enhanced AbstractHelper.BuildQueryString to support multi-value query strings:\r
481   IDictionary dict = new Hashtable();\r
482   dict.Add("id", 5);\r
483   dict.Add("selectedItem", new int[] { 2, 4, 99 });\r
484   string queryString = BuildQueryString(dict);\r
485   // should result in: "id=5&amp;selectedItem=2&amp;selectedItem=4&amp;selectedItem=99&amp;"\r
487 - FormHelper.Select() - applied patch from James Sapara allowing firstoptionvalue to be set to \r
488   something other than null. \r
490 - Restored property IsPostback checking (For use with WebFormViewEngine).\r
492 - Restored support for passing additional arguments to a controller\r
493   via Send and use a dictionary to supply that information.\r
495 - Applied patch by Andrew Peters fixing MR-182\r
496   "Adds FormTo and LinkToWithPost methods to HtmlHelper"\r
498 - Fixed MR-180\r
499   "Url Tokenizer Bug at Turkish Culture Info"\r
501 - Properly quote file/directory arguments in Pre/Post Build Events to accomodate\r
502   names with spaces.\r
503   Also added some missing files to TestSiteWindsor-vs2005 Project\r
505 - Removed DetermineIfPostBack due to side effects when using a custom upload approach\r
506   Also removed PreRequestHandler setting the session as it wasn't really necessary using\r
507   this event for that. Moved to the handler.\r
509 - Included abstract Filter class, just as a helper to implement filters \r
510   with a better interface (instead of IFilter.Process)\r
512 - Fixed MR-165 "DataBind doesn't bind NullableDateTime"\r
514 - Fixed MR-169\r
515   "Scarfold record modification results exception Can't edit without \r
516   the proper id when validation is failed in the defined validation rule"\r
518 - Fixed MR-168 \r
519   "ValidateEmail attribute does not work properly in Monorail Scarfold"\r
521 - Introduced CacheAttribute which can be used on actions to configure \r
522   the underlying HttpCachePolicy\r
524 - Modified WizardActionProvider to use ControllerLifecycleExecutor\r
526 - Modified EngineContextModule a MonoRailHttpHandler to use ControllerLifecycleExecutor\r
528 - Refactored controller. Extracted process to ControllerLifecycleExecutor\r
530 - Changed ExecuteEnum.Always to include 'StartRequest'\r
532 - Added Filter step: StartRequest\r
534   This step runs on the ResolveRequestCache, and is suitable \r
535   for authentication. However, a session will not be available.\r
537 - Fixed MR-158\r
538   "IRequest/Controller must expose the Http method"\r
539   \r
540   Added the following properties to the Controller class:\r
541     IsPost/IsGet/IsPut/IsHead\r
543 - Fixed problem with view components reported by Ernst Naezer. The problem\r
544   is that the view component were cached, and instances shared during \r
545   template executions.\r
547 - Introduced smtpPort, smtpUsername, smtpPassword configuration to <monorail> node\r
549 - Introduced a PageSize property on the IPaginatedPage.\r
552 Release Candidate 2\r
553 ===================\r
555 - Applied patch by Ivan Porto Carrero fixing MR-158\r
556   "Validation throws errors when using group box."\r
557   \r
558   Quoting description:\r
559   \r
560         "When validating with the option of using a group box then the valdation routine throws an error.\r
561         The error is only thrown after the valdation failed for a couple of controls in the form. And when those errors are corrected and the form gets validated again that's when the error occurs\r
563         "I also added functionality to have a header in the group error box. I also added the possibility to have a separate error label to append to.\r
564         For this I added 2 properties to the config of the validation library.\r
565         The first property is boxErrorHeadingClass and the second one is errorSelectorCssClass\r
567         "In the core script I added 5 lines or so to add this functionality. "\r
569 - Applied patch by Nick Hemsley fixing MR-157\r
570   "add fromNameValueCollection method for creating IDictionary instances from (i.e.) Context.Params, or Request.QueryString"\r
571   \r
572   Method was renamed to FromNameValueCollection\r
574 - Introduced ARPagination.CreatePagination<T>(SimpleQuery<T>). Looks like it can be\r
575   extended later for the non-generic SimpleQuery.\r
577 - Made all Helpers that install javascript code use the same signature Helper.InstallScripts(). Should we mandate an interface?\r
579 - Fixed the GenerateJSProxy(string proxyName, string controller), which was passing a null areaName;\r
581 - Fixed the conflict between the Array.reduce function of Prototype e fValidate scripts (MR-166).\r
584 Release Candidate 1\r
585 ===================\r
587 - ARDataBinder was ovewriting ids on belongs to relations causing\r
588   NHibernate to throw exception. Fixed and added test cases\r
590 - Fixed binder problem (MR-161)\r
592 - Fixed Perfomance issue with Brail and sub views due to cache key normalization issues.\r
594 - Added logging to Brail, configured using the normal Castle's cofniguration mechansim\r
596 - Added support to passing parameters from the view to the layout, enabling a captureFor component in the view to be used in the layout\r
598 - Started refactoring ARScaffold to rely on FormHelper\r
600 - Small refactor on ARScaffold support to make it work with\r
601   . ARDataBinder\r
602   . The new Binder implementation\r
604 - Changed MonoRailContainer to save the configuration. On mono\r
605   a copy is created everytime the config is requested, leading a big problems\r
607 - Fixed MR-155\r
608   "Cast exception with configuration"\r
610 - Added two more events to ExtensionManager: Authorize and Authenticate.\r
611   That allows authentication/authorization extensions to MonoRail that won't\r
612   rely on filters\r
614 - Applied Jochen Grefe's patch fixing NVelocity-3\r
615   "#include not working for nvelocity"\r
617 - Another attempt to MR-152 "Error while initializing MonoRail services"\r
619   Separated container implementation from module. But it's important that \r
620   the module subscribe the events, so the container can delegate event invocations \r
621   to the extension manager\r
623 - Fixed MR-152 "Error while initializing MonoRail services"\r
625 - Applied midas's patch fixing MR-113\r
626   "change collected view name in assembly to lower"\r
628 - Applied Don Morrison's patch fixing MR-150\r
629   "Patch to fix problem with ARDataBinder and ARFetcher when dealing with joined subclasses."\r
631 - Added support for null property handling in Brail.\r
632         ${objMayBeNull.Name} -- will throw if null\r
633         ${ IgnoreNull(objMayBeNull).Name } -- will return empty string when null\r
634         \r
635 -- Breaking change in Brail. Removed <? ?> as markers for code blocks. This was done to allow handling of xml processing instructions (<?xml ?> for instnace).\r
636         Use <?brail ?> markers instead.\r
638 - Applied Marc-André's patch fixing MR-149\r
639   "[TestSupport] Verb not specified for Get request"\r
641 - Applied Ernst Naezer's patch that fixes MR-95 \r
642   "Update ProtoType/Scriptaculous js libraries to latest version"\r
643   \r
644   Prototype library updated to version 1.5.0_rc1\r
645   script.aculo.us updated to 1.6.4\r
647 - Added watir tests for JS proxies (fixes MR-142 "Write test cases for AjaxHelper.GenerateJSProxy()")\r
649 - Added watir tests for Ajax support\r
651 - Changed Ajax helper to default to parameters:'value=' + value instead of parameters:value.\r
652   This old way was causing null keys on the form dictionary and thus being ignored by \r
653   the databinder\r
655 - Fixed MR-106\r
656   "Apply Sean's suggestions"\r
657   \r
658   Component 'ChildContentComponent' introduced, plus a few test cases for it.\r
660 - Fixed MR-101\r
661   "Seems Wizard Controller can't define Area"\r
663 - Fixed MR-128\r
664   "Introduce the notion of conditions to WizardStepPage"\r
665   \r
666   Introduced IsPreConditionSatisfied to WizardStepPage\r
668 - Fixed MR-129\r
669   "Add log support as discussed on the mailing list"\r
671 - Added Logger property to Controller\r
673 - Added more logging information to the request lifecycle\r
675 - Logging support: Important services are now logging what they are doing. \r
676   Verbose logging happens at Debug Level. Error level is used for exceptions\r
678 - Refactored: The EngineContextModule was simplified. Now its duty is to \r
679   instantiate the services and invoke the lifecycle methods. Each service uses\r
680   its lifecycle methods to reference other services and obtain its configuration\r
682 - Refactored: replaceable services were moved to Services namespace\r
684 - Refactored: interfaces meant to be public were moved from Internal \r
685   namespace to the root\r
687 - Fixed MR-126\r
688   "PaginationHelper must support IList<T>"\r
690 - Fixed MR-146\r
691   "FormHelper must be able to handle IList<T>"\r
693 - Fixed MR-145 \r
694   "Change node/section name from monoRail to monorail on configuration file"\r
695   \r
696   Now on the configuration, use <monorail> instead of <monoRail>\r
698 - Included Test site for ActiveRecord support project, watir tests included\r
700 - Refactored ARDataBinder to support HasMany and HasAndBelongsToMany\r
702 - Applied Ernst Naezer <enix@ch10.shuis.tudelft.nl>'s patch fixing build\r
704 - Introduced [AjaxAction] attribute. Any action marked with this attribute\r
705   can be accessed on client-side scripting using a JavaScript proxy, like\r
706   this:\r
708      $ajaxHelper.getJavascriptFunctions()\r
709        ## MANDATORY, must come before any call to generateJSProxy\r
711      $ajaxHelper.generateJSProxy('thisController')\r
712        ## will declare an object named "thisController", allowing access\r
713        ## to all [AjaxAction]s on the current controller\r
715      $ajaxHelper.generateJSProxy('util', 'lists', 'myLists')\r
716        ## will declare an object named "myLists", allowing access\r
717        ## to all [AjaxAction]s on the controller named 'lists', in the 'util' area\r
719   Note that proxies can perform synchronous (blocking) or asynchronous (non-blocking) calls.\r
720   For asynchronous calls, you must always supply a JavaScript function as an additional\r
721   last parameter. When that parameter is absent, the proxy will perform a synchronous call.\r
723      [AjaxAction] public void Sum(int num1, int num2) { RenderText(Convert.ToString(num1 + num2)); }\r
725   You can write:\r
727      // synchronous call\r
728      $('result').value = myLists.sum($('num1').value, $('num2').value);\r
730   Or:\r
732      // asynchronous call\r
733      myLists.sum($('num1').value, $('num2').value, function(t) { $('result').value = t.responseText; });\r
735   Being:\r
737      $('num1').value     = the value of an input with id=num1\r
738      $('num2').value     = the value of an input with id=num2\r
739      function(t) { ... } = the callback\r
740      t.responseText      = any text that the action could have rendered\r
742 - Applied Marc-André's patch fixing MR-140\r
743   "ARDataBindAttribute doesn't  use the controller's DataBinder"\r
745 - Updated AbstractServiceContainer to support adding/removing services.\r
747 - MonoRails services now accept and IServiceContainer instead of an\r
748   IServiceProvider to be able to add services if desired.\r
750 - Small refactor of Controller to to accomodate passing action arguments.\r
752 - Updated SmartDispatchController to utilize HttpRequest parameters when\r
753   additional arguments are supplied via a Send.\r
755 - Applied patch by Freyr Magnússon <freyr.magnusson@gmail.com> fixing MR-139\r
756   "ExceptionChainingExtension doesn´t handle unhandled exceptions"\r
757   \r
758   Which also introduces a new feature:\r
760 Controllers can request IExceptionProcessor through IServiceProvider\r
761 and invoke the handlers to process an exception. For example:\r
763 public void BuyMercedes()\r
765                 try\r
766                 {\r
767                         ...\r
768                 }\r
769                 catch(Exception ex)\r
770                 {\r
771                         IExceptionProcessor exProcessor = (IExceptionProcessor) ServiceProvider.GetService(typeof(IExceptionProcessor));\r
772                         exProcessor.ProcessException(ex);\r
774                         RenderView("CouldNotBuyMercedes");\r
775                 }\r
778 - Changed DataBinder behavior to return empty arrays, instead of null arrays, \r
779   when the IBindingDataSourceNode is null\r
781 - Applied patch by  Bryan Brown fixing MR-138\r
782   "patch to fix formhelper.LabelFor to use IDictionary"\r
784 - Applied Freyr Magnússon's patch fixing MR-137\r
785   "Databinding through DataBindAttribute does not register errors with SmartDispatcherController"\r
787 - Applied peter dol's patch fixing MR-136\r
788   "An overload for ButtonToRemote that accepts htmloptions"\r
790 - WizardStepPage: added more redirect overloads to allow parameters to be \r
791   specified\r
793 - AR Support: Added support to deal with ICollection<T> containers\r
795 - Applied Marc-Andre's patch fixing MR-133\r
796   "TestSupport not working under Mono"\r
798 - Removed PropertyBag.Clear() in Controller.cs to restore the ability to\r
799   update the PropertyBag in filters.\r
801 - Applied Colin Ramsay <castleproject-devel@happyandlost.co.uk> patch making\r
802   the _selectedViewName field accessible through a public property.\r
804 - Checked in changes to better support ASP.NET Views\r
806 - Refactor FormHelper to use a common code to CheckboxList and Select. \r
807   Added support mentioned in MR-130\r
809 - Introduced CreateCheckboxList. See preliminary documentation at \r
810     http://www.castleproject.org/index.php/MonoRail:FormHelper#CheckboxList\r
812 - Applied Colin Ramsay <castleproject-devel@happyandlost.co.uk> patch adding more\r
813   asserts to TestSupport.AbstractMRTestCase and refactored some other things\r
815 - MR-125 testsupport doesn't handle posting to smart dispatcher controller \r
816   Fixed by Andrei Shires <andrei@internetware.co.uk>\r
818 - FormHelper: Now it can fill parameters with the values from the Request.Params\r
820 - FormHelper: fixed Checkbox behavior with databinder by adding a hidden \r
821   field with the same name but carrying the 'false' value. The false value\r
822   can be overriden with a key 'falseValue' if you're working with a non-boolean\r
823   \r
824   For example\r
825   \r
826   FormHelper.CheckboxField("some.property")\r
827   \r
828   Will render\r
829   \r
830   <input type="checkbox" id="some_property" name="some.property" value="true" />\r
831   <input type="hidden" id="some_propertyH" name="some.property" value="false" />\r
834   FormHelper.CheckboxField("acceptDisclaimer", %{trueValue = 'accept', hiddenValue = 'reject'})\r
835   \r
836   Will render\r
837   \r
838   <input type="checkbox" id="acceptDisclaimer" name="acceptDisclaimer" value="accept" />\r
839   <input type="hidden" id="acceptDisclaimerH" name="acceptDisclaimer" value="reject" />\r
842 - Applied Ernst Naezer's patch to allow MR to throw a descriptive\r
843   exception message when two helpers are registered using the same key\r
845 - Added a hack to the WebFormsViewEngine to accomodate different behavior\r
846   with respect to invoking PageParser.GetCompiledInstance on ASP.NET 2.0\r
848 - Added support for defaultValue attribute to FormHelper, which specificy\r
849   what the value should be if the target evaluates to null.\r
851 - Added indexed properties support to FormHelper\r
853   When the target is an array you can\r
854   \r
855     PropertyBag.Add("roles", Roles.FindAll());\r
856     --\r
857     FormHelper.TextField("roles[0].Id")\r
858   \r
859   Which will output\r
860   \r
861     <input type="text" id="roles_0_Id" name="roles[0].Id" value="1" />\r
863   The indexed property can be nested\r
865     PropertyBag.Add("user", User.Find(1));\r
866     --\r
867     FormHelper.TextField("user.roles[0].Id")\r
869     <input type="text" id="user_roles_0_Id" name="user.roles[0].Id" value="1" />\r
871 - Added RadioField(String target, object valueToSend, [IDictionary attributes]) to FormHelper\r
873   The radio will be marked with checked="checked" if the value collected \r
874   from the target matches the valueToSend parameter\r
876 - Fixed RedirectToAction on WizardStepPage. Now it produces a correct action url.\r
878 - Changed WizardStepPage.InternalRedirectToStep to simply RedirectToStep\r
880 - Changed SmartDispatcherController.BuildMethodArguments. Now it tests if the conversion \r
881   succeeded before setting the value on the array.\r
883 - Introduced IWizardPageFactory on WindsorExtension, so a Wizard controller doesn't\r
884   need to reference the IKernel directly\r
886 - Some optimization on Redirect* methods on Controller class. Now they accept\r
887   an IDictionary as a parameter specifier (in addition to NameValueCollection).\r
888   \r
889 - Refactored ControllerDescriptorBuilder (renamed to ControllerDescriptorProvider)\r
890   to use child providers to obtain descriptor. Attributes are now descriptors builders\r
891   and that allows one to come up with custom attributes like\r
893   public class MyAttribute : Attribute, ILayoutDescriptorBuilder, IHelperDescriptorBuilder\r
894   {\r
895      public LayoutDescriptor BuildLayoutDescriptor() \r
896      {\r
897        return new LayoutDescriptor("mylayout");\r
898      }\r
900      public HelperDescriptor[] BuildHelperDescriptors()\r
901      {\r
902        return new HelperDescriptor[] { new HelperDescriptor(typeof(MyHelper)) };\r
903      }\r
904   }\r
906   Kudos to Fabio by coming up with the idea.\r
908 - ViewComponents: added subsection support\r
910   (Using nvelocity as example)\r
911   \r
912   #blockcomponent(GridComponent)\r
913     #header\r
914       <th>Name</th>\r
915     #end\r
916     \r
917     #footer\r
918       Showing record $startrecord to $total\r
919     #end\r
920     \r
921     #item\r
922       <td>$item.Name</td>\r
923     #end\r
925     #empty\r
926       <td>No records found</td>\r
927     #end\r
928   #end\r
929   \r
930   On the code you can use\r
932         public override bool SupportsSection(String name)\r
933         {\r
934                 return name == "header" || name == "item" || name == "footer" || \r
935                         name == "empty";\r
936         }\r
938         public override void Render()\r
939         {\r
940                 ICollection source = (ICollection) ComponentParams["source"];\r
942                 StartTable();\r
944                 Context.RenderSection("header");\r
946                 if (source != null && source.Count != 0)\r
947                 {\r
948                         foreach(object item in source)\r
949                         {\r
950                                 PropertyBag["item"] = item;\r
951                                 \r
952                                 RenderText("<tr>");\r
953                                 \r
954                                 Context.RenderSection("item");\r
955                                 \r
956                                 RenderText("</tr>");\r
957                         }\r
958                 }\r
959                 else\r
960                 {\r
961                         RenderText("<tr>");\r
962                         Context.RenderSection("empty");\r
963                         RenderText("</tr>");\r
964                 }\r
966                 Context.RenderSection("footer");\r
968                 EndTable();\r
969         }\r
971 - ViewComponent on NVelocity: added to support to interpolation on component parameters. \r
973   Action:\r
974   \r
975     public void List()\r
976     {\r
977       PropertyBag.Add("customers", Customer.FindAll());\r
978     }\r
980   View:\r
982     #blockcomponent(GridComponent with "source=$customers")\r
983   \r
984     #end\r
985   \r
986   ViewComponent code:\r
987   \r
988     public override void Render()\r
989     {\r
990       IList items = (IList) ComponentParams["source"];\r
991     \r
992       foreach(object item in items)\r
993       {\r
994         Context.ContextVars["item"] = item;\r
995         // Do something like rendering the body\r
996       }\r
997     }\r
999 - Configuration changed:\r
1001   . Added <cacheprovider> node\r
1002   . Added <additionalSources> node under <viewEngine>\r
1004   Example:\r
1005   \r
1006   <monoRail>\r
1007     <cacheProvider type="my custom implementation"/>\r
1008     \r
1009     <viewEngine viewPathRoot="views" customEngine="Castle.MonoRail.Framework.Views.NVelocity.NVelocityViewEngine, Castle.MonoRail.Framework.Views.NVelocity">\r
1010       <additionalSources>\r
1011         <assembly name="MyAssembly" namespace="My.Assembly" />\r
1012       </additionalSources>\r
1013     </viewEngine>\r
1014   </monoRail>\r
1016 - IViewEngine refactored to use the IViewSourceLoader to locate views\r
1018 - Introduced IViewSourceLoader and IViewSource. The former represents an approach to load\r
1019   views. The default implementation is FileAssemblyViewSourceLoader which first look ups \r
1020   the file system then the configured assemblies for the specified view\r
1022 - ICacheProvider service introduced (available on IServiceProvider implementation).\r
1023   Two implementations available: \r
1024   \r
1025   . DefaultCacheProvider which uses the HttpContext.Cache\r
1026   . WeakReferenceCacheProvider which uses a hashtable with WeakReferences as entries\r
1028 - Warning about Nullables and SmartDispatcher arguments. The behavior has changed a\r
1029   little\r
1030   \r
1031   . In the past, if the value for a nullable was not present, that was accepted and\r
1032     the nullable was initialized with HasData=false\r
1033   . Now the value mustn't be present, but the entry must be present\r
1034   \r
1035   For example\r
1036   \r
1037   Controller Action:\r
1038   \r
1039         public void Transfer(NullableDouble amount)\r
1040         {\r
1041                 ...\r
1042         }\r
1043   \r
1044   If you invoke it with Controller/Transfer.rails you'll get an exception\r
1045   \r
1046   If you invoke it with Controller/Transfer.rails?amount= then it's ok\r
1048   If you invoke it with Controller/Transfer.rails?amount=10 is obviously ok too.\r
1050 - Removed Obsolete members of ExecuteEnum. If you were using\r
1052   . ExecuteEnum.Before, change to ExecuteEnum.BeforeAction\r
1053   . ExecuteEnum.After, change to ExecuteEnum.AfterAction or ExecuteEnum.AfterRendering\r
1054   . ExecuteEnum.Around, change to ExecuteEnum.Always or combine the flags\r
1056 - Refactored DefaultRailsEngineContext and EngineContextModule. Now EngineContextModule\r
1057   is also a ServiceContainer. When a DefaultRailsEngineContext is created we pass\r
1058   the EngineContextModule as a parent container. \r
1059   \r
1060   This saves us some cycles of registering\r
1061   the services on every single DefaultRailsEngineContext instance.\r
1063 - Added attribute 'checkClientIsConnected' to monoRail configuration check. If \r
1064   'true' the controller class will always check IsClientConnected on\r
1065   \r
1066   - InternalSend (beginning)\r
1067   - Before Staring filter process \r
1068   - Before invoking the view engine\r
1069   \r
1070   The default value is 'false'\r
1071   \r
1072   (kudos to Ahmed)\r
1074 - Removed AutoLoadUnlessKeyIs and NullIfKeyIs from ARDataBinder. Added enum \r
1075   AutoLoadBehavior to replace them:\r
1077   AutoLoadBehavior.Never (default): Means that no autoload should be perform on the target\r
1078     type nor on nested types.\r
1079       \r
1080   AutoLoadBehavior.Always: Means that autoload should be used for the target type\r
1081     and the nested types (if present). This demands that the primary key be present on the http request\r
1082   \r
1083   AutoLoadBehavior.NewInstanceIfInvalidKey: Means that we should autoload, but if the key is \r
1084     invalid, like null, 0 or an empty string, then just create a new instance of the target type.\r
1085   \r
1086   AutoLoadBehavior.NullIfInvalidKey: Means that we should autoload, but if the key is \r
1087     invalid, like null, 0 or an empty string, then just return null\r
1089 - Added support for AccessibleThrough(Verb.Post, or Verb.Get) to restrict the type of access a controller action requires.\r
1091 - Added suport for InPlaceRenderView for Brail\r
1093 - Added <? ?> tags for Brail, to match the php style.\r
1095 - Added RemoveCookie() method to IResponse\r
1097 - Fixed a bug in Brail's ViewComponents, where a parameter was search using case sensitive search.\r
1099 - Fixed a bug in ARFetch, where if the parameter was an array and the parameters didn't appear, a null reference would be thrown. Now it's returning an empty array.\r
1101 - Updated boo binaries, should fix the problems with the build on machines with only one framework installed.\r
1103 - Fixed a bug in Brail where a new line was required before a method call was recognized\r
1105 - Added support for optional parameters in Brail, using the syntax ?foo will return null if the value was not set (instead of throwing.)\r
1107 - Fixed a bug where Brail would throw on Empty Views.\r
1109 - Added support for AutoLoadUnlessKeyIs in ARDataBinder - will load the object unless the key is a specific value\r
1110  Usages: public void Save([ARDataBinder(AutoLoadUnlessKeyIs=0)] User user) \r
1112 - Added checks for null id when doing data binding.\r
1114 - Removed useless error handling from Brail, now you'll get the normal ASP.Net Yellow Screen Of Death on errors. More consistent with the rest of the framework.\r
1116 - Added support for <?brail ?> tags for Brail, so it can be valid XML documents\r
1118 - Added logging for Brail, so you can see the Boo code the preprocessor is generating.\r
1120 - Added more verbose output to compiler errors in Brail.\r
1122 - Changed the way Brail name the generated class, now the chances for name clashes are much lower. (View: Users.boo and a parameter Users will not cause problems).\r
1124 - Fixed a bug with Brail not picking up changes that occured by VS.Net\r
1126 - Fixed bug with NVelocity components that caused an InvalidCastException to be thrown by the Render method if there was something other than an IRailsEngineContext occupying the "context" key.\r
1128 - MonoRail is now CLSCompliant (kudos to Roelof Blom <roelof.blom@gmail.com>)\r
1130 - Breaking change: now MonoRail requires that you add the following module to web.config:\r
1132         <system.web>\r
1133                 <httpModules>\r
1134                         <add name="monorail" type="Castle.MonoRail.Framework.EngineContextModule, Castle.MonoRail.Framework" />\r
1135                 </httpModules>\r
1136         </system.web>\r
1138 - Configuration nodes and attributes changes:\r
1139   - mailto to mailTo \r
1140   - mailfrom to mailFrom\r
1141   - customsession to customSession\r
1143 - SmartViewComponent removed\r
1145 - DataBinder refactored out. Now implementation lies on Castle.Components.Binder\r
1146   + Big performance improvement\r
1148 - ARDataBinder now issues a FindByPK for nested objects if the keys differs (existing object with \r
1149   form fields)\r
1151 - SmartDispatcherController: now there's no hardcode reference to DataBind, ARDataBind or ARFetch attributes. \r
1152   They only must implement the interface IParameterBinding. This opens an interesting extension point\r
1153   for users willing to create their own logic to binding form/querystring parameters to their data components\r
1155 - Controller: Added RedirectToAction(String action, params String[] queryStringParameters)\r
1156   example:  RedirectToAction("edit", "id=" + id, "error=couldn't update the row");\r
1158 - Added FlashBinderAttribute (being evaluated)\r
1160 - Added FormHelper (being evaluated)\r
1162 - Added CaptureFor component\r
1164 - Renamed ARPager splitted into ARPaginationHelper and ARPager\r
1166 - ARDataBinder is now able to deal with HasAndBelongsToMany relations. \r
1167   This works in two ways. Suppose you have a Product class with a relation HasAndBelongsToMany to Category.\r
1168   \r
1169   If you send the following fields from a form:\r
1170     \r
1171     product.categories.id=1 \r
1172     product.categories.id=2\r
1173     \r
1174   ARDataBinder will ignore the AutoLoad property and always populate the Categories \r
1175   collection on the product class with the result of FindByPrimaryKey of the categories.\r
1176   Any other field will be ignored, for example product.categories.name will not be bound\r
1177   \r
1178   However, if you send the values like\r
1179   \r
1180     product.categories[0].id=1 \r
1181     product.categories[1].id=2\r
1182     \r
1183   Then ARDataBinder will use the usual path, not ignoring the AutoLoad.\r
1184   \r
1185   This behavior is being evaluated.\r
1187 - Removed AbstractExtension\r
1189 - Extension now uses events (See ExtensionManager)\r
1191 - Interface IMonoRailExtension changed (has only Init method now)\r
1193 - Refactored IParameterBinder in order to make it participate on calculations points.\r
1195 - Introduced WindsorMonoRailSectionHandler which has the support for statements similar to those supported\r
1196   by windsor's XmlInterpreter\r
1197   \r
1198 - Added ARDataBindAttribute.NullWhenPrimaryKey which forces the databinder to\r
1199   ignore and do not load a record if the retrieved PK has the value assigned to this\r
1200   property (kudos to Roelof Blom <roelof.blom@gmail.com>)\r
1202 Beta 5\r
1203 ======\r
1205 ** Core ** \r
1207 - Fixed Flash (it now persists the new entries between requests)  (by Ahmed)\r
1209 - Added FilterAttribute.ExecutionOrder, the default value is Int32.MaxValue \r
1210   so the less the value higher will be the filter priority\r
1212 - Added Controller.RedirectToAction(String actionName)\r
1214 - Added Controller.RedirectToAction overloads (by Fabio Batista)\r
1216 - Controller.Redirect(String) is now virtual, and it's called by all Redirect* methods (by Fabio Batista)\r
1218 - Moved action collection to ControllerMetaDescriptor class, using new method that does not require ScreenCommonPublicMethods.\r
1220 - Moved ControllerDescriptorBuilder creation to ProcessEngineFactory to ensure ControllerDescriptors are only created once\r
1222 - ITrace and Trace property added to IRailsEngineContext (kudos to Chad Humphries)\r
1224 - Hierarchy of areas support (kudos to Fabio Batista)\r
1226 - Support for [Layout] attribute on Actions, so actions can override \r
1227   the Controller's specified layout (by Fabio Batista, rev 1459)\r
1229 - PaginationHelper introduced: paginates objects that implements IList, and supports caching.\r
1231 - ARPager introduced: allows you to specify a custom NHibernate HQL Query or an NHibernate Criteria\r
1232   (using Expression.Eq, à là ActiveRecord's FindAll()) and fetch the results with pagination.\r
1233   (by Fabio Batista)\r
1235 - Added IServerUtility.JavaScriptEscape() (kudos to Chad Humphries)\r
1237 - Added DataBindAttribute.Exclude - A comma separated list of property names \r
1238   to exclude from databinding (kudos to Chad Humphries)\r
1240 - Added IResponse.BinaryWrite() and CreateCookie( HttpCookie ) overload\r
1242 - Added IServerUtility.MapPath()\r
1244 - Added IRailsContext.ApplicationPhysicalPath\r
1246 - Added to HtmlHelper:\r
1247   - InputCheckbox\r
1248   - InputRadio\r
1249   - InputFile\r
1250   - InputButton\r
1251   - Form(action, attribtes) overload\r
1253 - Added more fine-grained support for ExecuteEnum in Filters (by Fabio Batista, rev 1286-1287)\r
1255     The values are now: BeforeAction, AfterAction, AfterRendering and Always.\r
1256   \r
1257 - Support for nullable types in SmartDispatcherController, useful for\r
1258   detecting missing ValueType parameters. Works with Nullables library, still\r
1259   not working on .NET 2.0 Nullables (by Fabio Batista, rev 1297 and 1363)\r
1261   Example of use:\r
1263     // .NET 1.1\r
1264     public void CreateTicket(string name, NullableDateTime date, NullableInt32 priority)\r
1265     {\r
1266       if (name == null || name.Length == 0) throw new MissingFieldException();\r
1267       if (!date.HasValue) throw new MissingFieldException();\r
1268       if (!priority.HasValue) throw new MissingFieldException();\r
1269     }\r
1271     // .NET 2.0 (NOT WORKING YET)\r
1272     public void CreateTicket(string name, DateTime? date, int? priority)\r
1273     {\r
1274       if (name == null || name.Length == 0) throw new MissingFieldException();\r
1275       if (!date.HasValue) throw new MissingFieldException();\r
1276       if (!priority.HasValue) throw new MissingFieldException();\r
1277     }\r
1279 - Broaded support for Enums. They can be specified by number or by text (by Fabio Batista, rev 1203)\r
1281   public enum MyEnum {\r
1282     First = 1,\r
1283     Second = 2\r
1284   }\r
1285   \r
1286   <input type="hidden" name="myEnumValue" value="1" />\r
1287   <input type="hidden" name="myOtherEnumValue" value="seCoNd" />\r
1288   \r
1289   public void TestEnumValues(MyEnum myEnumValue, MyEnum myOtherEnumValue)\r
1290   {\r
1291     if (myEnumValue == MyEnum.First) // ok\r
1292     if (myOtherEnumValue == MyEnum.Second) // ok\r
1293   }\r
1295 - Support for ActiveRecord fetching in Castle.MonoRail.ActiveRecordSupport\r
1296   (by Fabio Batista, rev. 1380).\r
1297         \r
1298         Mainly for those unconfortable with direct binding of form values\r
1299         to ActiveRecord objects. This attribute only fetches the ActiveRecord based\r
1300         on its Primary Key, nothing more.\r
1301         \r
1302         Usage:\r
1303         \r
1304                 public class MyCrudExample : ARSmartDispatchController\r
1305                 {\r
1306                         // simple usage.\r
1307                         public void Save( [ARFetch] Example example, string name, ...)\r
1308                         {\r
1309                                 example.Name = name;\r
1310                                 // ...\r
1311                                 \r
1312                                 example.Save();\r
1313                         }\r
1315                         // using a different request parameter, instead of the action's parameter name\r
1316                         public void Save( [ARFetch("primaryKey")] Example example, string name, ...)\r
1317                         {\r
1318                                 example.Name = name;\r
1319                                 // ...\r
1320                                 \r
1321                                 example.Save();\r
1322                         }\r
1324                         // ignoring invalid primary keys\r
1325                         public void Save( [ARFetch(Require=false)] Example example, string name, ...)\r
1326                         {\r
1327                                 example.Name = name;\r
1328                                 // ...\r
1329                                 \r
1330                                 example.Save();\r
1331                         }\r
1333                         // not creating new records automatically, when the parameter is empty or null\r
1334                         public void Save( [ARFetch(Create=false)] Example example, string name, ...)\r
1335                         {\r
1336                                 if (example == null)\r
1337                                         example = new Example(someRequiredConstructorParameter);\r
1338                                 \r
1339                                 example.Name = name;\r
1340                                 // ...\r
1341                                 \r
1342                                 example.Save();\r
1343                         }\r
1345                         // fetching a list of Active Records\r
1346                         public void Delete( [ARFetch("selected")] Example[] examples )\r
1347                         {\r
1348                                 foreach (Example example in examples)\r
1349                                         example.Delete();\r
1350                         }\r
1351                 }\r
1353 - Support for smart arrays (aside from primitives) (kudos do Ahmed)\r
1355   Quoting the explanation:\r
1356   \r
1357 Suppose you have this class:\r
1359  \r
1360 class Person\r
1362   public string Name {get;set;}\r
1364   public int Age {get;set;}\r
1367 With the following view \r
1369   <input name="Person[0].Name"   value="John">\r
1370   <input name="Person[0].Age"    value="30">\r
1371   <input name="Person[1].Name"   value="Mary">\r
1372   <input name="Person[1].Age"    value="25">\r
1374 Now you can specify the DataBinderAttribute to an array element in your controller:\r
1376 public void SavePeople( [DataBinder(Prefix=”People”)] Person[] people )\r
1378   // you should be able to access the people as an Person array\r
1380   Assert.IsTrue( people[0].Name == “John” );\r
1381   Assert.IsTrue( people[1].Name == “Mary” );\r
1384 There are a couple extra things, first you can specify an “ignore” attribute to any element in which that case the data binder will completely ignore the element\r
1386   <input name="Person[0].Name"   value="John">\r
1387   <input name="Person[0].Age"    value="30">\r
1388   <input name="Person[0]@ignore" value="yes">\r
1389   <input name="Person[1].Name"   value="Mary">\r
1390   <input name="Person[1].Age"    value="25">\r
1392 In the previous html code, the people array in the controller will only have one element (Mary).\r
1394 Notice that I reserved the @ sign as a special character to add metadata to any element, right now the only attributes supported are “ignore” and “count”.\r
1396 The count attribute serves as a performance optimization when your elements are keyed using sequential integers, for example:\r
1398   <input name="Person@count"   value="5">\r
1399   <input name="Person[0].Name" value="John">\r
1400   <input name="Person[1].Name" value="James">\r
1401   <input name="Person[2].Name" value="Jeff">\r
1402   <input name="Person[3].Name" value="Geoff">\r
1403   <input name="Person[4].Name" value="Jeffrey">\r
1405 ** Ajax Helper **\r
1406    \r
1407 - AjaxHelper2 renamed to AjaxHelper. The old one was renamed to AjaxHelperOld\r
1409 - Two more callbacks supported: onSuccess and onFailure. For example\r
1411   $AjaxHelper.BuildFormRemoteTag( $DictHelper.CreateDict("url=something.rails", "OnSuccess=myjavascriptfunction();", "OnFailure=otherfunction(request)" ) );\r
1412   \r
1413   Do not confuse it with 'success' and 'failure' keys, though. Those means the id of elements\r
1414   to be updated in the event of success and failure.\r
1417 ** NVelocity View Engine **\r
1419 - Added support for global macros. Every *.vm file which is placed in the Views/macros directory\r
1420   will be scanned for macros (by Fabio Batista, rev. 1374)\r
1422 ** Brail View Engine **\r
1424 - Upgraded to use Boo 0.75, should solve the problem that Brail had with breaking tests.\r
1426 ** Scaffolding support **\r
1428 - huge refactoring\r
1429 - It's now using templates\r
1432 ** Test support **\r
1434 - Introduced Castle.MonoRail.TestSupport\r
1437 ** Bug fixes **\r
1439 MR-68   PreSendView is not being invoked by NVelocityViewEngine\r
1440         http://support.castleproject.org/jira/browse/MR-68\r
1441 MR-66   DataBinder and ConvertUtils should support TypeConverters\r
1442         http://support.castleproject.org/jira/browse/MR-66\r
1443 MR-64   DataBinder.Convert should support decimal\r
1444         http://support.castleproject.org/jira/browse/MR-64\r
1445 MR-58   AbstractHelper generates invalid XHTML\r
1446         http://support.castleproject.org/jira/browse/MR-58\r
1447 MR-57   Wrong urls are crashing UrlTokenizer\r
1448         http://support.castleproject.org/jira/browse/MR-57\r
1449 MR-52   Support for real Flash feature\r
1450         http://support.castleproject.org/jira/browse/MR-52\r
1451 MR-49   Remove public properties from the list of available actions (Controller.cs)\r
1452         http://support.castleproject.org/jira/browse/MR-49\r
1453 MR-30   MR should not accept incorrect urls\r
1454         http://support.castleproject.org/jira/browse/MR-30\r
1457 Beta 4\r
1458 ======\r
1460 - Added useWindsorIntegration attribute to monoRail configuration section\r
1462 Beta 3\r
1463 ======\r
1465 - Databind\r
1466 - Initial Scaffolding support\r
1467 - Routing feature\r
1468 - Localization support\r
1469 - More helpers and improvements\r
1472 Beta 2\r
1473 ====== \r
1475 - Few bug corrections\r
1476 - Applied patch from Dru Sellers: NVelocityViewEngine adds a $siteRoot exposing the Request.ApplicationPath\r