ASP.NET 3.5

Labels
AJAX(112) App Studio(7) 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(183) 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
ASP.NET 3.5
Thursday, November 27, 2008PrintSubscribe
RSS Your Data

It seems that RSS feeds are everywhere. You find them on your computer desktop, in your favorite web browser bookmarks, email readers. Links to RSS feeds are sprinkled all over the web. Your cell phone and TV are likely able to show RSS feeds as well.

RSS feed can free your inbox from being flooded by various email notifications about events of interest that you might have subscribed to. Email notifications are "pushed" to your inbox by servers that host the data. RSS feeds are "pulled" from the servers by RSS reader applications on-demand. You control your RSS subscriptions by configuring the frequency of delivery, the number of items in a feed, and the size of the archive.

Data Aquarium Framework now supports View RSS Feed command option in all data views that have an action bar. Here is how the action group must be defined in a data controller descriptor file.

<actionGroup scope="ActionBar" headerText="Actions">
  <action commandName="ExportCsv" headerText="Export to Spreadsheet" 
        description="Analyze items with spreadsheet&lt;br/&gt; application." />
  <action commandName="ExportRss" headerText="View RSS Feed" 
        description="Syndicate items with an RSS reader." />
  <action />
  <action commandName="Custom" commandArgument="MyCommand" 
        headerText="My Command" description="Execute my custom command" />
</actionGroup>

Navigate to http://dev.codeontime.com/demo/nwblob and select Orders in the drop down in the top left corner of the page. Sort orders in descending order of order date and limit orders to those shipped via Federal Shipping.

Your screen will like the one below.

image

Select Actions|View RSS Feed option on action bar above the grid view.

image

An RSS feed will be displayed. Here is how the RSS feed looks when displayed in Microsoft Internet Explorer 7.0.

image

You can see this feed live at http://dev.codeontime.com/demo/NWBlob/Export.ashx?q=PHEgYz0iT3JkZXJzIiB2PSJncmlkMSIgcz0iT3JkZXJEYXRlIGRlc2MiIGU9IkV4cG9ydFJzcyI%2bPGY%2bU2hpcFZpYUNvbXBhbnlOYW1lOj1GZWRlcmFsIFNoaXBwaW5nPC9mPjwvcT4%3d.

The link looks cryptic for a reason. Parameter q in the URL specifies unique encoded query to retrieve an RSS feed from our hosted demo application and instructs the server to sort orders in descending order by order date and filter ship via field by Federal Shipping.

Click on link Great Lakes Food Market to see the details of the order on a standard details page automatically generated as a part of your ASP.NET application by our code generator, Code OnTime Generator. You can edit order details and return back to the feed by clicking on Close button.

image

Feed viewer capabilities depend on your web browser. Here is how the feed of employees is presented in Apple Safari.

image

Typically you can search the feed content and sort data in various ways. If there is a least on date field in your data view then the item publication date is defaulted to this field.

The real value of RSS will reveal itself when you subscribe to a feed.

For example, subscribe to the orders feed referenced above in Internet Explorer. If you are using Vista as operating system then it is likely displaying a side bar with various gadgets. Add Feed Headlines gadget to the side bar if you don't already have one. Configure the gadget to read the orders feed.

image

A list of order customer names will be displayed in the gadget.

image

If you select a customer name then order details are immediately displayed next to the gadget. If you click on a customer name then details of order will be presented. If you click on Orders|Orders link then a complete live RSS feed is displayed. The gadget will automatically scroll the list.

Add a new order to the database. Next automatic "pull" of RSS feed will show you a new order right on your desktop without any need to sign into a web application or sending an e-mail notification from the server. 

This may work great in various scenarios. Your information workers can create an unlimited number of data feeds by filtering and ordering any application data to their liking and viewing and subscribing to RSS feeds created based on the current data view that they see. New data that falls under the same filtering and sorting conditions will show up when the feeds are updated.

There are numerous RSS feed readers out there. Popular Email applications will also display RSS feeds and tell users when new feed items are available, which can make your business data more tightly integrated in everyday business processes.

Our powerful ASP.NET code generator, Code OnTime Generator, will instantly create robust AJAX applications based on Data Aquarium Framework. See a complete list of features of the framework at http://codeontime.com/productsae.aspx.

Saturday, November 1, 2008PrintSubscribe
Context-Sensitive Data Lookups

Data Aquarium Framework now supports context-sensitive lookups.

A common situation in a data entry application may require limiting the possible foreign key values of fields based on other fields in a data table row.

Consider Northwind database table Products. It stores a product inventory. Each product has a category and a supplier. If you where to build a data entry screen for this table then you may soon realize that it would be nice to limit the number of categories displayed to a user based on a supplier selection. Suppliers typically offer a few categories of products and it may improve data entry efficiency if we were to automatically hide categories that do not have any products that were previously purchased from a supplier.

Here is a picture of a product entry screen automatically created by Code OnTime Generator.

image

Let's implement a context-sensitive category lookup.

We have to create a database view to allow us implementation of category lookup discussed above. Please execute the following script to create view SupplierCategories in the Northwind database.

create view [dbo].[SupplierCategories]
as
select distinct
    "Categories"."CategoryID" "CategoryID"
    ,"Categories"."CategoryName" "CategoryName"
    ,"Suppliers"."SupplierID" "SupplierID"
    ,"Suppliers"."CompanyName" "SupplierCompanyName"
from
"dbo"."Categories" "Categories"
  inner join "dbo"."Products" "Products" on
    "Products"."CategoryID" = "Categories"."CategoryID"
  inner join "dbo"."Suppliers" "Suppliers" on
    "Suppliers"."SupplierID" = "Products"."SupplierID"

The view provide us with all product categories provided by our suppliers.

image

Next we will create a new data controller descriptor SuppliersCategories.xml as a copy of Categories.xml.

Change command command1 of new data controller descriptor as shown in this snippet.

    <command id="command1" type="Text">
      <text>
        <![CDATA[
select
    "Categories"."CategoryID" "CategoryID"
    ,"Categories"."CategoryName" "CategoryName"
    ,"Categories"."Description" "Description"
    ,"SupplierCategories"."SupplierID" "SupplierID"
    ,"SupplierCategories"."SupplierCompanyName" "SupplierCompanyName"
from "dbo"."Categories" "Categories"
  inner join "dbo"."SupplierCategories" "SupplierCategories" on
    "SupplierCategories"."CategoryID" = "Categories"."CategoryID"
]]>
      </text>
    </command>

Change fields element to provide definitions for fields SupplierID and SupplierCompanyName.

<fields>
  <field name="CategoryID" type="Int32" allowNulls="false" isPrimaryKey="true" label="Category#" readOnly="true" />
  <field name="CategoryName" type="String" allowNulls="false" label="Category Name" />
  <field name="Description" type="String" allowQBE="false" allowSorting="false" label="Description" />
  <field name="SupplierID" type="Int32" label="Supplier#">
  <field name="SupplierCompanyName" type="String" label="Supplier Company Name"/>
</fields>

Change view grid1 to include field SupplierID under alias SupplierCompanyName.

<dataFields>
  <dataField fieldName="CategoryName" columns="15" />
  <dataField fieldName="Description" rows="5" />
  <dataField fieldName="SupplierID" aliasFieldName="SupplierCompanyName"/>
</dataFields>

The purpose of these changes is to allow filtering by SupplierID when grid view grid1 is presented to a user.

Now we are ready to modify the data controller descriptor Products.xml to use SupplierCategories instead of Categories in the lookup definition of field CategoryID.

<field name="CategoryID" type="Int32" label="Category#" contextFields="SupplierID">
  <items style="Lookup" dataController="SupplierCategories" newDataView="createForm1" />
</field>

We have replaced data controller reference from Categories to SupplierCategories.

Another important change is a new attribute contextFields. This attribute specifies a comma-separated list of fields defined in this data controller descriptor that will provide the source of filter values for the fields in the view of SupplierCategories data controller that have matching names when a lookup is displayed. The filter is automatically set as an external, which hides the filter field from end-user. SupplierID is never presented by is used in filtering.

Here is how it looks in a real application. Only two categories of products are available from supplier Exotic Liquids.

image

Let's select supplier Plutzer Lebensmittelgroßmärkte AG and check out the available categories. Five categories are available for selection.

image

Context-sensitive lookups are available to premium project subscribers.

Friday, October 31, 2008PrintSubscribe
Upload and Download of BLOB in AJAX Applications

Data Aquarium Framework introduces a new feature that allows code-free uploading and downloading of Binary Large Objects to/from a database table column in AJAX style. The feature is based on a generic handler blob.ashx from File Upload premium project.

Here is screen shot from a sample application available at http://dev.codeontime.com/demo/nwblob.

image

If a BLOB field is storing an image then a thumbnail preview is automatically created. A preview is available in all views. Other types of BLOB are presented by a simple download hyperlink. Views are displaying additional controls that allow BLOB uploading when records are presented in edit or detail mode.

image

BLOB support is enabled only when you are interacting with existing records. BLOB data cannot be uploaded when creating new records. The internal preview and upload mechanism is based on automatic table row references based on primary keys, which makes uploading of BLOB impossible when records are created.

Original BLOB data can be retrieved from a database with a click of mouse. Here is a screen shot from Adventure Works application that shows side-by-side small and large photographs of products. Original BLOB data other then images will be opened by native applications when downloaded completely by your web browser.

image

A confirmation message is displayed at the top of the page when a BLOB data has been uploaded successfully.

image

You can find complete implementation details for all of these features in the project source code.

Making It Work

Generate a Data Aquarium Framework application from Northwind database and open ~/Contollers/Categories.xml data controller descriptor. Find definition of Picture field. It must look like the one below.

<field name="Picture" type="Byte[]" onDemand="true" 
  sourceFields="CategoryID" 
  onDemandHandler="CategoriesPicture" onDemandStyle="Thumbnail" 
  allowQBE="false" allowSorting="false" label="Picture" />

Three attributes are turning on the BLOB support. Attribute sourceFields must list all fields that allow to find the row with a BLOB. This information is passed on to a generic handler blob.ashx located in the root of your web site project. The name of the handler is specified by onDemandHandler attribute. Optional style for an on-demand field is controlled by onDemandStyle attribute.

Generic handler blob.ashx is automatically generated by Code OnTime Generator. All handlers discovered in your database are listed at the top of the file.

Here is how they look in a Northwind application written in C#.

public partial class BlobFactory
{
    
    static BlobFactory()
    {
        // register blob handlers
        RegisterHandler("CategoriesPicture", "\"dbo\".\"Categories\"", "\"Picture\"", 
            new string[] {"\"CategoryID\""}, "Categories Picture", String.Empty);
        RegisterHandler("EmployeesPhoto", "\"dbo\".\"Employees\"", "\"Photo\"", 
            new string[] {"\"EmployeeID\""}, "Employees Photo", String.Empty);
    }
}

You can quickly change these handlers and add the new ones when needed. The parameters of RegisterHandler method are easy to understand.

image

The first parameter defines a key that is provided as a value for onDemandHandler attribute in data controller descriptors. The second parameter is a fully qualified name of the table that stores BLOB values. The third parameter specifies a column name of a BLOB. A list of key columns of this table follows in the fourth parameter. A user-friendly name of the blob in the fifth parameter is for GUI presentation.

The last parameter defines a content type of a BLOB. If the value is an empty string then the code of generic handler will try to automatically find the content type by treating the value as an image. If you are storing a specific type of data other then image then enter a valid content type that matches the BLOB. For example, if you are storing Microsoft Word documents then use application/msword as content type.

Continue to Lookup Item Styles