Wednesday, December 29, 2010

Developing With Web App Factory

User feedback has brought about further enhancements to the Web App Factory code generator project for ASP.NET/AJAX available with Code On Time generator.

  • Code generation of a Web App Factory project will now conclude with an automatic rebuild of the solution.
  • If the solution has been rebuilt successfully then the project home page will be loaded in the default web browser.
  • If the solution has failed to compile then Visual Studio/Visual Web Developer Express will be started. The project will be automatically rebuild to show the error messages in IDE of your development tool.
  • Similar sequence of “rebuild and start a browser if success” or “rebuild and show Visual Studio if failure” is executed when user selects browse action next to the project name on the start page of the code generator.

The change will significantly simplify development when code formulas, code expressions, and custom code is incorporated in the project. If an error is introduced then there will be no way of missing the problem thanks to the latest enhancements.

Web App Factory projects are implemented as a solution with a class library and web application project. Changes to themes, new code files, changes in the target .NET Framework of the project, and other such modifications may result in erroneous references in the solution and project files.

The code generator will frequently try to preserve the previous changes making an assumption that user will take care of correcting any inconsistencies. The effort is made to pick up any new files in the project folders to update the solution projects. If you are well under way in your development process then there should be few situations when such updating of the project files will cause problems. The new compilation mode will automate the detection of problems and will not mask them by launching the website with the last known “good” build of the application, which was happening in the previous releases of the code generator.

If you would like to try various features of the code generator then a sample Web Site Factory project may be a better choice than Web App Factory project. Web Site Factory projects do not require a project file and are easily handling changes to the project configuration.

We recommend creating Web Site Factory projects unless a solution with web application project is requirement. Both, Web Site Factory and Web App Factory produce functionally identical web applications.

Bug Fixes

Several fixes were introduced to correct the following issues:

  • Business Objects were generated with compilation errors when the first field of the primary key is string and the number of fields in the corresponding table was less or equal to four.
  • Symbol “single quote” in navigation menu title or description was causing the runtime error which led to the failure of the page to render correctly.
  • Auto Complete lookup style has been failing to render when lookup field has the type of “String” and there is no alias field.
  • Web App Factory projects failed to compile when a dedicated login page has been enabled.
  • User Name and User ID lookup styles were not working.
  • “Read Roles” defined on a field level in Designer Spreadsheet were not transferred to the baseline application .
  • Lookup details were not working with Web App Factory projects.

Web App Factory projects can be deployed to Windows 2008 servers without any known issues.

Installation Issues

Code On Time generator is a Windows application that hosts an Internet Explorer web browser within the boundaries of the main window. The code generator navigates to the HTML files stored locally on the hard drive of your computer. HTML files provide interactive user interface of the code generator based on JavaScript. No information is transmitted over the web to our server when you generate your applications. The input and output files of the code generator are stored entirely on your computer.

In a few instances there were reports of the code generator displaying a blank page with Code On Time logo at the top when the generator starts. No other user interface elements were present. Re-installation of the code generator would not help.

The issue has to do with the security settings of Internet Explorer.

Background

Internet Explorer allows controlling if execution of the JavaScript embedded into HTML pages is allowed.

The computer has five security zones,  namely:

(0) Local Machine zone,  
(1) Internet,  
(2) Local intranet,
(3) Trusted sites, and
(4) Restricted sites.

However the Internet Explorer user interface allows users to configure only 4 of the 5 security zones using the Internet Explorer interface.

The Local Machine zone (0), is an implicit zone that exists on the local computer, security settings for this zone cannot be configured using the Internet Options Control Panel.

Any configuration done from the Internet Explorer interface have absolutely no effect on enabling scripts to run within Windows Applications on the local computer (a matter which also affects Code On Time code generator).

Steps to Reproduce

If you save the emphasized text below to the file named "Steps to reproduce.reg" and double-click the file to add the file entries to the registry then the script execution in the Local Machine Zone will become disabled. DO NOT DO THAT !!!Winking smile 

REGEDIT4
 
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\0]
 
"1200"=dword:00000000
"1201"=dword:00000001
"1400"=dword:00000000
"1406"=dword:00000000
"1C00"=hex:00,00,02,00
 
[HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\CurrentVersion\Internet Settings]
 
"Security_HKLM_only"=dword:00000001

Steps to Rectify

If you save the emphasized text presented below to the file "Script Permissions Fix.reg"  and double-click the file to add the file entries to the registry then the script execution in the Local Machine Zone will be allowed. Code On Time generator will start functioning correctly.  

REGEDIT4
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\0]
"1400"=dword:00000003
[HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\CurrentVersion\Internet Settings]
"Security_HKLM_only"=dword:00000001

References

http://support.microsoft.com/kb/833633

This information has been provided courtesy of Gabriel Inya-Agha of Quickening Group.

Web App Factory –Compilation, Browsing, and Subversion Compatibility

Code On Time code generator for ASP.NET/AJAX has been extended to support automatic compilation of Web App Factory projects.

A Web App Factory project is produced as Visual Studio solution with the core application incorporated into a Class Library. The website pages are hosted in WebApp web application project included in the same solution. This type of project is recommended for experienced developers.

The latest release of the code generator automatically compiles and starts the compiled project in a web browser. This feature requires Visual Studio 2010/2008 or Visual Web Developer Express 2010/2008 installed on your computer. This behavior can be disabled in the project wizard on the Web Server page.

Web App Factory projects can be also compiled and started through browser action available on the start page of the code generator next to the name of the project.

Web App Factory projects are now ignoring system folders and files created by Subversion version control software.

The client library has been enhanced to add a supplemental CSS Class name to auto complete component in order to reflect the type of the auto-complete behavior. Classes SearchBar, Filter, AutoComplete, and Lookup and rendered to indicate the type of the auto complete control, which allows creating custom visual presentation of the control. The current version the theme collection does not create any visual distinctions of the four types of auto complete control.

Tuesday, December 28, 2010

Multiple Value Filters

Code On Time applications now support multiple value adaptive filters that can be activated from the context menu of a columns in a grid view and in a search bar.

The screen shot below shows new Filter option in the context menu of Category Name column or the Products page.

image

The menu option will activate a a selection window similar to the one below.

image

Displayed options are sensitive to the presence of other filters. The window automatically adapts the list of available options.

Here you can see the products filtered by Category Name and Supplier Company Name. Both fields are filtered by multiple values.

image

If you activate the search bar by clicking on the arrow next to the Quick Find field then the new “include” function is selected in the relevant search parameter. Click on any of the filter options in the search value field of a parameter to activate the option selection window.

image

Notice that options presented in the selection window are sensitive to search criteria entered on the search bar if the window has been activated from the search bar.

image

Multiple value filtering works with all data types including numbers and dates. The next screen shot shows products further restricted to those with Reorder Level of “0” and “10”.

image

Users can collapse the search bar and further refine the search results using the Quick Find search box.

Multiple value filtering significantly simplifies development of data aware applications and saves tremendous amount of time required to develop a similar functionality from scratch. Multiple value filtering requires no programming and is automatically available in all views of your application.

Monday, December 27, 2010

Web App Factory, Multiple Value Filters, …

The latest release of Code On Time generator introduces several bug fixes and new major features.

  • Advanced Filters and Search Bar options have been enhanced to allow adaptive filtering with multiple values. The screenshot below shows the new “include” search bar option that allows selecting multiple values to filter a column.

    image
    Multiple value filter can be activated from the context menu of the column header. The context menu with the highlighted filter option is shown in the picture.
     
  • Web App Factory project now supports ASP.NET 4.0 and ASP.NET 3.5. Projects of this type are generated as a Visual Studio solution with the core application and data controllers placed in a separate class library and application pages hosted in a separate Web Application project. A bare-bones Sandbox project is also included to provide a starting point for developers looking to integrate the core application in their own projects.

The new release will produce applications with EnableCdn property of the ScriptManager set to “False” by default to prevent errors during development without Internet connection.

Rich Editor is now provided with a dedicated host page that prevents a runtime error in Windows 2008 deployments.

Web App Factory provides additional entries that will ensure application operating without errors in Windows 2008 instances of IIS 7 with the new pipeline mode.

Business Objects now support an  advanced version of Select and SelectSingle methods that will allow to use filter expressions to be executed against the database.

Coming Soon

The next release of the code generator will include new Chart and Pivot views. Stay tuned.

Monday, December 6, 2010

Conversion and Validation of User Input

Code On Time applications offer powerful methods of converting and validating field values entered by user. The unique business rules model allows elegant abstraction of the business logic required to validate and convert user values from the user interface elements responsible for presentation.

Conversion

Let’s consider a simple conversion scenario that requires automatic conversion of a customer contact name to upper case as soon as user has finished typing. We will use Northwind database for this sample.

Generate your project, activate designer and select All Controllers tab. Select Customers data controller, switch to Fields tab and select the ContactName field. Select the check box “The value of the field is calculated by a business rule expression”.

Enter the following Code Formula if your programming language is C#:

!String.IsNullOrEmpty(contactName) ? contactName.ToUpper() : String.Empty

Visual Basic programmers should use the following instead:

IIf(Not (String.IsNullOrEmpty(contactName)), contactName.ToUpper(), String.Empty)

Next scroll the designer page down and enter ContactName in the Context Fields property. This is very important step that will ensure that the business rules formula is executed as soon as user leaves the field.

Here is the screen short of Designer that shows the partial configuration of the ContactName field.

image

Try running the program and observe the contact name convert to upper case as soon as you enter a value.

image

Note that this works in all views without you doing anything about it. You change the model and all views automatically engage the business rules.

Here is the actual file that is automatically produced to implement this calculation. This code is placed into ~/App_Code/Rules/Customers.Generated.cs file

using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using MyCompany.Data;

namespace MyCompany.Rules
{
    public partial class CustomersBusinessRules : 
        MyCompany.Data.BusinessRules
    {
        
        [ControllerAction("Customers", "Calculate", "ContactName")]
        public void CalculateCustomers(string customerID, 
            string companyName, string contactName, string contactTitle, 
            string address, string city, string region, 
            string postalCode, string country, string phone, string fax)
        {
            UpdateFieldValue("ContactName", 
                !String.IsNullOrEmpty(contactName) ? 
                    contactName.ToUpper() : 
                    String.Empty);
        }
    }
}

Note that the class is partial. You can implement you own class with the same name and offer a method that performs a more complex conversion using database or any other resources required for successful conversion calculation. Make sure not to change the file directly since the changes will be lost during next code generation. Instead use Designer to change the Code Formula of the corresponding field.

Here is the Visual Basic version of the same automatically generated method.

Imports MyCompany.Data
Imports System
Imports System.Collections.Generic
Imports System.Data
Imports System.Linq
Imports System.Text.RegularExpressions
Imports System.Web

Namespace MyCompany.Rules
    
    Partial Public Class CustomersBusinessRules
        Inherits MyCompany.Data.BusinessRules
        
        <ControllerAction("Customers", "Calculate", "ContactName")> _
        Public Sub CalculateCustomers(ByVal customerID As String, _
                                      ByVal companyName As String, _
                                      ByVal contactName As String, _
                                      ByVal contactTitle As String, _
                                      ByVal address As String, _
                                      ByVal city As String, _
                                      ByVal region As String, _
                                      ByVal postalCode As String, _
                                      ByVal country As String, _
                                      ByVal phone As String, _
                                      ByVal fax As String)
            UpdateFieldValue("ContactName", _
                             IIf(Not (String.IsNullOrEmpty(contactName)), _
                                 contactName.ToUpper(), _
                                 String.Empty))
        End Sub
    End Class
End Namespace

Accessing field values

Many scenarios of validation may be narrowed performed as silent conversion using the method described above.  The business rules methods offer every single field of the field dictionary of the data controller and you can use values of all fields to produce the value.

You can also use methods SelectFieldValue and SelectFieldValueObject and retrieve a field value required for conversion/validation.

The first method will return the untyped object representing the value of the field or external URL parameter. It is your responsibility to convert the value to use it in a calculation. For example,

Convert.ToString(SelectFieldValue("ContactName")).ToUpper()

The second method returns only the value objects that correspond to the fields of the data controller. The advantage of using SelectFieldValueObject is the ability to access the “Old” and “New” values and availablility of  Modified  property that tells if the field value has changed.

Convert.ToString(SelectFieldValueObject("ContactName").NewValue).ToUpper())

Validation

Validation is usually performed just before the standard logic of Code On Time application is about to be executed. User has completed input and initiated a command that will result in INSERT, UPDATE, or DELETE statement execution.

Let’s consider another example. Let’s prevent posting of invalid values to the Order Details table.

Select your project on the start page of the code generator, activate designer, find Order Details data controller, select the data controller and edit the controller to have OrderDetailsBusinessRules as business rules Handler. See the screen shot below.

image

Save the changes, exit the designer and generate the project.

Open the project in Visual Studio using File | Open Web Site option and double click the ~/App_Code/Rules/OrderDetaulsBusinessRules.cs file to open it in the editor. Enter the following method if your project language is C#.

using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using MyCompany.Data;

namespace MyCompany.Rules
{
    public partial class OrderDetailsBusinessRules : MyCompany.Data.BusinessRules
    {
        [ControllerAction("OrderDetails", "Update", ActionPhase.Before)]
        [ControllerAction("OrderDetails", "Insert", ActionPhase.Before)]
        public void ValidateInput(float? discount, short? quanity, decimal? price)
        {
            if (quanity.HasValue && quanity > 10)
                if (!Controller.UserIsInRole("Administrators"))
                    throw new Exception("You are not authorized to sell more then 10 items.");
            if (discount.HasValue && discount.Value > 0.15)
                throw new Exception("The discount cannot be more than 15%.");
            if (!price.HasValue || price.Value == 0.0m)
            {
                Result.ExecuteOnClient("this._focus('UnitPrice', 'The price must be greater than zero.')");
                throw new Exception("Please validate the entered unit price.");
            }
        }

    }
}

Here is the Visual Basic version.

Imports MyCompany.Data
Imports System
Imports System.Collections.Generic
Imports System.Data
Imports System.Linq

Namespace MyCompany.Rules

    Partial Public Class OrderDetailsBusinessRules
        Inherits MyCompany.Data.BusinessRules

        <ControllerAction("OrderDetails", "Update", ActionPhase.Before)> _
        <ControllerAction("OrderDetails", "Insert", ActionPhase.Before)> _
        Public Sub ValidateInput(ByVal discount As Nullable(Of Single), _
                                 ByVal quantity As Nullable(Of Short), _
                                 ByVal unitPrice As Nullable(Of Decimal))
            If (quantity.HasValue AndAlso quantity > 10) Then
                If (Not Controller.UserIsInRole("Administrators")) Then
                    Throw New Exception("You are not authorized to sell more then 10 items.")
                End If
            End If
            If (discount.HasValue AndAlso discount.Value > 0.15) Then
                Throw New Exception("The discount cannot be more than 15%.")
            End If
            If (Not (unitPrice.HasValue) Or (unitPrice.HasValue AndAlso unitPrice.Value = 0)) Then
                Result.ExecuteOnClient("this._focus('UnitPrice', 'The price must be greater than zero.')")
                Throw New Exception("Please validate the entered unit price.")
            End If

        End Sub

    End Class
End Namespace

Notice that the order of the arguments in the validation method is absolutely irrelevant. The same method is handling both Insert and Update actions. You can implement a dedicated method to handle each situation differently. You can use a Shared Business Rules method to create a handler for multiple data controllers.

Runt he program, select Customers | Order Details page and try entering the order details records while leaving blank Discount, Unit Price, and Quantity fields. The Unit Price validation will detect the problem and will result in the following. The message bar at the top of the page indicates that there is a problem. The inline error message explains what the problem in with more details.

image

The future versions of the code generation library will offer an alternative method of indicating the error using the business rules method to eliminate the need to use a snippet of JavaScript to report the validation error.

Wednesday, December 1, 2010

Auto-Complete Lookup Style

The resent release of  Code On Time  supports new Auto-Complete style of data lookup. This style of data lo0kup does not require pre-fetching of data items, works well with large data sets, supports incremental search and multi-field copy.

The picture below shows the Auto-Complete lookup style in action. User has types a letter “S” in Supplier Company Name lookup field and has the first matching option automatically selected. Just hit Tab or Enter key to enter the value or continue typing to refine the visible options. 

image

User can also click on the drop arrow to get the list of up to 300 records that match the entered sample.

image

The incremental search in auto-complete lookup field is case-insensitive.  If a field is optional and inactive then the empty value is indicated as N/A.  The empty lookup field will clear up to allow immediate data entry upon receiving input focus.

If a text is entered but not validated by matching it to an existing lookup record then the value automatically reverts to the previous state when focus is lost.

Why Use Auto-Complete Lookup Style?

The code generator automatically configures foreign key fields to present powerful data lookup window. The screen shot below shows a product record in “new” mode. Supplier Company Name and Category Name lookups are represented by “(select)” link.

image

If a user clicks on Supplier Company Name link then the Supplier data lookup window is presented.  Users can see multiple field columns, page, sort, and filter records.

image

Sometimes it turns out to be too much. Extra mouse clicks are never appreciated if users have to enter a lot of data.

An alternative is to use a List Box or Drop Down List lookup style. Supplier Company Name field is presented as a list box and Category Name field is rendered as a drop down list of available categories in the following screen shot.

image

The disadvantage of this approach is the need to retrieve the lookup values upfront in order to populate the drop down list and the list box controls. The list boxes and drop down lists will not work well with large sets of records.

Configuring Auto-Complete Lookup Style

Open the project in designer, select the Products data controller, and start editing properties of SupplierID field.

Set Items Style to Auto Complete, set Data Value Field to SupplierID, and assign Company Name to Data Text Field property. It is critical to select the Data Text Field to ensure that the auto-complete input control allows incremental search for records.

image

Save the changes, select the SupplierID field again and click on Data Fields tab. Enter 30 in the Columns property for each binding of the field to the data controller views. A data field is a binding of a field to a view. Three data fields (bindings) are linked to createForm1, editForm1, and grid1 in the next illustration.

image

Make similar changes to the CategoryID field in the Products data controller.

image

image

Generate the project and let your users to enjoy the auto-complete functionality. The following screen shot shows the Auto-Complete lookup displayed inline in the Category Name column of the grid1 view.

image

You can find more about Code OnTime Generator, Data Aquarium Framework, and other great products here.


© 2010 Code OnTime LLC. Intelligent code generation software for ASP.NET. Visit us at http://codeontime.com