// --------------------------- COPYRIGHT NOTICE ---------------------------------
// ASP.NET DaST - LittleNonsense DEMO
// Copyright (C) 2011 by Roman Gubarenko
// http://www.makeitsoft.com/
// ------------------------------------------------------------------------------
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
// ------------------------------------------------------------------------------
// Primary Contact : rgubarenko@gmail.com
// Project Home : http://www.makeitsoft.com/
// Help & Support : http://www.makeitsoft.com/forums/
// ------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using AspNetDaST.Web;
/// <summary>
/// Summary description for NonsenseAdvanced
/// </summary>
public class NonsenseExample2Controller : ScopeController
{
public override string ProvideTemplate()
{
return Utils.LoadTemplate("NonsenseExample2.htm"); // load temlate content from anywhere
}
public override void InitializeModel(ControllerModelBuilder model)
{
// scope binding handlers
model.SetDataBind(new DataBindHandler(DataBind_ROOT));
model.Select("CustomerRepeater").SetDataBind(new DataBindHandler(DataBind_CustomerRepeater));
model.Select("CustomerRepeater", "Customer").SetDataBind(new DataBindHandler(DataBind_Customer));
model.Select("CustomerRepeater", "Customer", "OrderRepeater").SetDataBind(new DataBindHandler(DataBind_OrderRepeater));
model.Select("CustomerRepeater", "Customer", "OrderRepeater", "Order").SetDataBind(new DataBindHandler(DataBind_Order));
model.Select("CustomerRepeater", "Customer", "OrderRepeater", "Order", "ItemRepeater").SetDataBind(new DataBindHandler(DataBind_ItemRepeater));
model.Select("CustomerRepeater", "Customer", "OrderRepeater", "Order", "ItemRepeater", "Item").SetDataBind(new DataBindHandler(DataBind_Item));
// set child controllers
model.Select("CustomerRepeater", "Header").SetController(new ScopeHeaderController());
model.Select("CustomerRepeater", "Customer", "Header").SetController(new ScopeHeaderController());
model.Select("CustomerRepeater", "Customer", "OrderRepeater", "Header").SetController(new ScopeHeaderController());
model.Select("CustomerRepeater", "Customer", "OrderRepeater", "Order", "Header").SetController(new ScopeHeaderController());
model.Select("CustomerRepeater", "Customer", "OrderRepeater", "Order", "ItemRepeater", "Header").SetController(new ScopeHeaderController());
model.Select("CustomerRepeater", "Customer", "OrderRepeater", "Order", "ItemRepeater", "Item", "Header").SetController(new ScopeHeaderController());
// handle client actions
model.Select("CustomerRepeater", "Header").HandleAction("RaisedFromChild", new ActionHandler(Action_RaisedFromChild));
model.Select("CustomerRepeater", "Customer", "Header").HandleAction("RaisedFromChild", new ActionHandler(Action_RaisedFromChild));
model.Select("CustomerRepeater", "Customer", "OrderRepeater", "Header").HandleAction("RaisedFromChild", new ActionHandler(Action_RaisedFromChild));
model.Select("CustomerRepeater", "Customer", "OrderRepeater", "Order", "Header").HandleAction("RaisedFromChild", new ActionHandler(Action_RaisedFromChild));
model.Select("CustomerRepeater", "Customer", "OrderRepeater", "Order", "ItemRepeater", "Header").HandleAction("RaisedFromChild", new ActionHandler(Action_RaisedFromChild));
model.Select("CustomerRepeater", "Customer", "OrderRepeater", "Order", "ItemRepeater", "Item", "Header").HandleAction("RaisedFromChild", new ActionHandler(Action_RaisedFromChild));
}
#region Action Handlers
private void Action_RaisedFromChild(object arg)
{
if ((string)arg == "parent")
{
CurrPath(-1).Refresh(); // refresh parent scope of the root scope of header controller
CtrlPath().MessageClient("RefreshedFromServer", new { ScopeID = CurrPath(-1).ClientID }); // notify client of refreshed scope
}
else if ((string)arg == "child")
{
// find name of the next scope depending on current scope
string nextScope = null;
string currScope = CurrPath(-1).ClientID.Split('-').Last();
switch (currScope)
{
case "CustomerRepeater": nextScope = "Customer"; break;
case "Customer": nextScope = "OrderRepeater"; break;
case "OrderRepeater": nextScope = "Order"; break;
case "Order": nextScope = "ItemRepeater"; break;
case "ItemRepeater": nextScope = "Item"; break;
}
// invoke action on Header scope of the first child scope
if (nextScope != null)
{
CurrPath(-1, nextScope, "Header").InvokeAction("InvokedFromParent", null);
}
}
}
#endregion
#region Binding Handlers
private void DataBind_ROOT()
{
CurrPath().Replace("{TodayDate}", DateTime.Now.ToString("yyyy-MM-dd")); // output some example values
CurrPath().Replace("{ScopeID}", CurrPath().ClientID); // bind scope client id
}
private void DataBind_CustomerRepeater()
{
var customers = DataLayer.GetCustomers(); // get all customers
CurrPath().RepeatStart();
foreach (var customer in customers) // repeat scope for each customer
{
CurrPath().Repeat();
CurrPath("Customer").StoredParams.Set("CustomerID", customer.GetValue("ID")); // pass customer ID to each child Customer scope
}
}
private void DataBind_Customer()
{
var customerID = CurrPath().StoredParams.Get<string>("CustomerID"); // get customer ID set in previous binding handler
var customer = DataLayer.GetCustomer(customerID); // get customer object by ID
CurrPath().Replace("{CustomerID}", customer.GetValue("ID"));
CurrPath().Replace("{CustomerName}", customer.GetValue("Name"));
}
private void DataBind_OrderRepeater()
{
var customerID = CurrPath(-1).StoredParams.Get<string>("CustomerID"); // get customer ID from parent Customer scope
var orders = DataLayer.GetOrders(customerID); // get orders by customer ID
CurrPath().RepeatStart();
foreach (var order in orders) // repeat scope for each order
{
CurrPath().Repeat();
CurrPath("Order").StoredParams.Set("OrderID", order.GetValue("ID")); // pass order ID to each child Order scope
}
}
private void DataBind_Order()
{
var orderID = CurrPath().StoredParams.Get<string>("OrderID"); // get order ID set in previous binding handler
var order = DataLayer.GetOrder(orderID); // get order object by ID
CurrPath().Replace("{OrderID}", order.GetValue("ID"));
CurrPath().Replace("{OrderDate}", order.GetValue("Date"));
}
private void DataBind_ItemRepeater()
{
var orderID = CurrPath(-1).StoredParams.Get<string>("OrderID"); // get order ID from parent Order scope
var items = DataLayer.GetOrderItems(orderID); // get order items by order ID
CurrPath().RepeatStart();
foreach (var item in items) // repeat scope for each item
{
CurrPath().Repeat();
CurrPath("Item").StoredParams.Set("ItemID", item.GetValue("ID")); // pass item ID to each child Item scope
}
}
private void DataBind_Item()
{
var itemID = CurrPath().StoredParams.Get<string>("ItemID"); // get item ID set in previous binding handler
var item = DataLayer.GetOrderItem(itemID); // get item object by ID
CurrPath().Replace("{ItemID}", item.GetValue("ID"));
CurrPath().Replace("{ItemName}", item.GetValue("Name"));
}
#endregion
}