Tips and Tricks

Labels
AJAX(112) App Studio(8) Apple(1) Application Builder(245) Application Factory(207) ASP.NET(95) ASP.NET 3.5(45) ASP.NET Code Generator(72) ASP.NET Membership(28) Azure(18) Barcode(2) Barcodes(3) BLOB(18) Business Rules(1) Business Rules/Logic(140) BYOD(13) Caching(2) Calendar(5) Charts(29) Cloud(14) Cloud On Time(2) Cloud On Time for Windows 7(2) Code Generator(54) Collaboration(11) command line(1) Conflict Detection(1) Content Management System(12) COT Tools for Excel(26) CRUD(1) Custom Actions(1) Data Aquarium Framework(122) Data Sheet(9) Data Sources(22) Database Lookups(50) Deployment(22) Designer(177) Device(1) DotNetNuke(12) EASE(20) Email(6) Features(101) Firebird(1) Form Builder(14) Globalization and Localization(6) How To(1) Hypermedia(2) Inline Editing(1) Installation(5) JavaScript(20) Kiosk(1) Low Code(3) Mac(1) Many-To-Many(4) Maps(6) Master/Detail(36) Microservices(4) Mobile(63) Mode Builder(3) Model Builder(3) MySQL(10) Native Apps(5) News(18) OAuth(9) OAuth Scopes(1) OAuth2(13) Offline(20) Offline Apps(4) Offline Sync(5) Oracle(11) PKCE(2) Postgre SQL(1) PostgreSQL(2) PWA(2) QR codes(2) Rapid Application Development(5) Reading Pane(2) Release Notes(184) Reports(48) REST(29) RESTful(29) RESTful Workshop(15) RFID tags(1) SaaS(7) Security(81) SharePoint(12) SPA(6) SQL Anywhere(3) SQL Server(26) SSO(1) Stored Procedure(4) Teamwork(15) Tips and Tricks(87) Tools for Excel(2) Touch UI(93) Transactions(5) Tutorials(183) Universal Windows Platform(3) User Interface(338) Video Tutorial(37) Web 2.0(100) Web App Generator(101) Web Application Generator(607) Web Form Builder(40) Web.Config(9) Workflow(28)
Archive
Blog
Tips and Tricks
Friday, October 8, 2010PrintSubscribe
Detecting Lookup Field Changes

Here is the screen shot of the New Products screen from the Northwind sample. Suppose you want to implement detection of value change in Supplier Company Name lookup that must result in clearing of Category Name along with resetting of Reorder Level field to 100.

image

Open your project and click Design button to activate the project designer. Select All Controllers tab and click on Products data controller. Click Edit button and enter ProductsBusinessRules in the Handler field in Business Rules section. Click Save to persist the changes.

image

Select the same data controller once more and click on Fields tab. Select CategoryID field and click Edit button. Select the check box in General section labeled “The value of the field is calculated by a business rule expression”. Scroll down to Dynamic Properties section and enter SupplierID in ContextFields. Click OK to save the changes.

image

From now on any changes to the SupplierID field in the client web browser will trigger a server side event that will be handled by methods in ProductsBusinessRules class. The class definition will be automatically generated once and will not be overwritten by the code generator in the future.

Now it is time to add the business logic that will react to the changes in the SupplierID fields.

The business rules class is located in ~/App_Code/Rules/ProductsBusinessRules.vb(cs) file.

The first example below is written in Visual Basic.NET. 

Here is how it implements the logic described at the top of this article.  Attribute ControllerAction on method ResondeTOChangeInSupplierID will ensure that the method is invoked in response to the system action “Calculate” when any of the fields specified in Context Fields property of CategoryID is changed in the client browser.

Notice that we are assigning text “(select)”  to the CategoryCategoryName field. This field is an alias for the CategoryID. You can also change any unrelated fields as well such ReorderLevel.

The last updated data field will be focused on the client.

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

Namespace MyCompany.Rules
    
    Partial Public Class ProductsBusinessRules
        Inherits MyCompany.Data.BusinessRules

        <ControllerAction("Products", "Calculate", "CategoryID")> _
        Sub RespondToChangeInSupplierID(ByVal supplierID As Nullable(Of Integer))
            If supplierID.HasValue Then
                UpdateFieldValue("ReorderLevel", 100)
            Else
                UpdateFieldValue("ReorderLevel", Nothing)
            End If
            UpdateFieldValue("CategoryCategoryName", "(select)")
            UpdateFieldValue("CategoryID", Nothing)
        End Sub
    End Class
End Namespace

The C# version of the same business rule is presented next.

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

namespace MyCompany.Rules
{
    public partial class ProductsBusinessRules : MyCompany.Data.BusinessRules
    {
        [ControllerAction("Products", "Calculate", "CategoryID")]
        public void RespondToChangeInSupplierID(int? supplierID)
        {
            if (supplierID.HasValue)
                UpdateFieldValue("ReorderLevel", 100);
            else
                UpdateFieldValue("ReorderLevel", null);
            UpdateFieldValue("CategoryCategoryName", "(select)");
            UpdateFieldValue("CategoryID", null);
        }
    }
}

The screen shot of the New Products  form just after the selection of a supplier is presented below.

image

Monday, August 2, 2010PrintSubscribe
Disabling Action on Specific Pages

Q.  How can I disable the New and Delete button on any particular page.

A.

Consider using WhenHRef property of data controller actions. Open the data controller definition in Designer, select Actions tab and activate the action. The action property WhenHRef must represent a valid regular expression.

For example, If you want to use New and Delete actions on pages ~/Pages/Page1.aspx and ~/Pages/Page2.aspx only then the following syntax will work.

Page1|Page2

The assumption is made that the same data controller is present on both pages. You can use any valid regular expression to create a URL test.  The expression will be tested against the URL in the web browser address box. A more precise and complex expression may look as the one below:

/Pages/Page(1|2)\.aspx

If there are other pages that use the same data controller and you want to prevent New and Delete actions from displaying on Page1 and Page2 but have them available on all other pages then we recommend to use an extension to regular expression syntax. Simply put "false:" in front of your expression:

false:Page1|Page2

The prefix in the example above is not a part of regular expression definition and is used to make it easier writing negative regular expression then would have been required otherwise.

Monday, August 2, 2010PrintSubscribe
Testing and Deploying ASP.NET 4.0 Apps

Code OnTime code generator is not using IIS to run the generated web sites on development machine.

Please install one of the following on your machine to enable testing of ASP.NET 4.0 web sites generated with Code OnTime generator:

Both products will install local Web Developer Server on your machine. There are two Web Developer servers capable of running ASP.NET 3.5, and ASP 4.0. You can find the at "C:\Program Files (x86)\Common Files\microsoft shared\DevServer\10.0".

Our code generator is producing ASP.NET 3.5 web sites for all code generation projects. Web Site Factory code generation project also supports ASP.NET 4.0. The code generator will need WebDev.WebServer40.EXE to run the ASP.NET 4.0 projects.  Otherwise WebDev.WebServer20.exe is required.

image

If you run the code generator and select the "browse" option next to the name of your project then the appropriate version of the local web server will be started.

If you are generating an ASP.NET 4.0 project and running it under IIS 7 then the following requirements must be met:

You may need to execute "iisreset" from command line to restart the server for  changes to take affect.

Otherwise the application deployment procedure is based on XCOPY model. You will find numerous deployment options described at http://msdn.microsoft.com/en-us/library/ms178610(VS.80).aspx.

We are planning to publish a visual tutorial explaining the deployment process on our YouTube channel. Subscribe to be notified when next batch of tutorials is available.