Работа №2. ASP.NET страницы, темы, таблицы
Факультет компьютерных систем и сетей
Кафедра информатики
Отчет
по лабораторным работам
по предмету Избранные Главы Информатики
Выполнил:
ст. гр. 052004
Зезюлькин Д. Ю.
Преподаватель:
Тычко Д.Н.
Минск 2012
Работа №1: Разработка архитектуры проекта и дизайна сайта
Цель работы.
Планирование архитектуры веб-проекта, изучение основ HTML и CSS.
Постановка задачи.
Необходимо выбрать для реализации один из предлагаемых веб-проектов. Для выбранного проекта продумать и реализовать:
1. Общую архитектуру.
2. Компоненты бизнес-логики и слоя доступа к данным (50%).
3. Общую схему сайта (какие страницы планируются и как будет осуществляться навигация между страницами).
4. Макет сайта (макет подразумевает выбор раскладки (Layout) страниц, цветовых решений, шрифтов и т.п.). Необходимо предъявить 2-3 страницы (HTML+CSS), иллюстрирующие макет.
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="e_Shop.Site"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>e-Shop</title>
<asp:ContentPlaceHolder ID="HeadTagContentPlaceHolder" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form id="MainForm" runat="server">
<div id="header">
<div class="user">
<asp:MultiView ID="UserView" runat="server" ActiveViewIndex="0">
<asp:View runat="server">
<asp:TextBox ID="LoginTextBox" runat="server"></asp:TextBox>
<asp:TextBox ID="PasswordTextBox" runat="server" TextMode="Password" AutoPostBack="true"></asp:TextBox>
</asp:View>
<asp:View runat="server">
Добро пожаловать, <asp:Label ID="UserNameLabel" runat="server"></asp:Label>.
<asp:LinkButton runat="server" Text="Выйти" OnClick="LogoutButtonClick"/>
</asp:View>
</asp:MultiView>
</div>
<ul class="menu">
<li class="home"><a href="./default.aspx" title="Главная">Главная</a></li>
<li class="catalog"><a href="./catalog.aspx" title="Каталог">Каталог</a></li>
<li class="about"><a href="./about.aspx" title="О нас">О нас</a></li>
</ul>
<asp:ContentPlaceHolder ID="SearchContentPlaceHolder" runat="server">
</asp:ContentPlaceHolder>
</div>
<div id="content">
<div id="leftPan">
<asp:ContentPlaceHolder ID="leftPanelContentPlaceHolder" runat="server">
</asp:ContentPlaceHolder>
</div>
<div id="middlePan">
<asp:ContentPlaceHolder ID="middlePanelContentPlaceHolder" runat="server">
</asp:ContentPlaceHolder>
</div>
<div id="rightPan">
<asp:ContentPlaceHolder ID="rightPanelContentPlaceHolder" runat="server">
</asp:ContentPlaceHolder>
</div>
<div class="clear"></div>
</div>
<div id="footer">
<p>Copyright © Untitled Company.</p>
</div>
</form>
</body>
</html>
Работа №2. ASP.NET страницы, темы, таблицы
Цель работы.
Ознакомление с основными элементами управления ASP.NET.
Постановка задачи.
Необходимо создать набор ASP.NET страниц сайта и связать компоненты страниц со слоем бизнес-логики веб-проекта (на момент защиты лабораторной работы должно быть готово не менее 70% от общего числа планируемых страниц). При создании страниц обязательным является использование эталонных страниц, тем, проверочных элементов управления, табличных элементов управления. Страницы должны демонстрировать возможности сохранения состояния и кэширования.
Catalog.aspx:
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Catalog.aspx.cs" Inherits="e_Shop.Catalog" StylesheetTheme="DefaulTheme" %>
<%@ Register TagPrefix="ajaxToolkit" Namespace="AjaxControlToolkit" Assembly="AjaxControlToolkit"%>
<%@ Register TagPrefix="My" TagName="CategoriesMenu" Src="CategoriesMenu.ascx" %>
<asp:Content ContentPlaceHolderID="HeadTagContentPlaceHolder" runat="server">
</asp:Content>
<asp:Content ContentPlaceHolderID="SearchContentPlaceHolder" runat="server">
<div class="SearchContainer">
Поиск: <asp:TextBox ID="SearchTextBox" runat="server" AutoPostBack="true" CssClass="TextBox"></asp:TextBox>
</div>
<div class="BasketWrapper">
<asp:LinkButton ID="HiddenButton" runat="server" CssClass="modal"/>
<asp:ScriptManager ID="asm" runat="server" />
<asp:Panel ID="ModalPanel" runat="server" CssClass="BasketView">
<asp:Button ID="OKButton" runat="server" Text="x"/>
<asp:GridView runat="server" ID="BasketGridView" AutoGenerateColumns="false" EmptyDataText="There is nothing in your shopping cart." GridLines="None" Width="600px" CellPadding="5" ShowFooter="true" DataKeyNames="ID" OnRowDataBound="BasketRowDataBound" OnRowCommand="BasketRowCommand" BorderColor="#535352">
<HeaderStyle HorizontalAlign="Left" ForeColor="#FFFFFF" />
<FooterStyle HorizontalAlign="Right" ForeColor="#FFFFFF" />
<Columns>
<asp:TemplateField HeaderText="Name" ItemStyle-Width="300px">
<ItemTemplate>
<asp:Label runat="server" Text='<%# Eval("Product.Name") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Quantity" ItemStyle-Width="100px">
<ItemTemplate>
<asp:Label runat="server" Text='<%# Eval("UnitsQuantitty") %>'></asp:Label><br />
<asp:LinkButton runat="server" Text="+" CommandName="Add" CommandArgument='<%# Eval("ID") %>' Font-Underline="false"></asp:LinkButton>
<asp:LinkButton runat="server" Text="-" CommandName="Remove" CommandArgument='<%# Eval("ID") %>' Font-Underline="false"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="UnitPrice" HeaderText="Price" DataFormatString="{0:F2}" ItemStyle-Width="100px"/>
<asp:TemplateField HeaderText="Total" ItemStyle-Width="100px">
<ItemTemplate>
<asp:Label runat="server" Text='<%# ((decimal)Eval("UnitPrice") * (short)Eval("UnitsQuantitty")).ToString("0.00") + "$" %>'/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<br />
<asp:LinkButton runat="server" Text="Оформить заказ" OnClick="RegisterOrderButtonClick" />
</asp:Panel>
<ajaxToolkit:ModalPopupExtender ID="mpe" runat="server"
TargetControlID="HiddenButton" PopupControlID="ModalPanel">
</ajaxToolkit:ModalPopupExtender>
В <asp:LinkButton ID="BasketButton" runat="server" Text="корзине" OnClick="BasketButtonClick"/>:
<asp:Label runat="server" ID="BasketProductsCount" Text="0"/>
</div>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="leftPanelContentPlaceHolder" runat="server">
<asp:RadioButtonList runat="server" ID="CategoriesMenu" OnSelectedIndexChanged="CategoriesMenuItemSelected" AutoPostBack="true" CssClass="CategoriesMenu">
</asp:RadioButtonList>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="middlePanelContentPlaceHolder" runat="server">
<asp:Repeater runat="server" ID="ProductsView" OnItemCommand="OrderButtonClick">
<ItemTemplate>
<div class="Product">
<div class="ProductImage"><img src="./Images/<%# DataBinder.Eval (Container.DataItem, "ImageURL") %>" alt="<%# DataBinder.Eval (Container.DataItem, "Name") %>" width="119" height="123" border="0" /></div>
<h3><%# DataBinder.Eval (Container.DataItem, "Name") %></h3>
<div class="Description">
<p><span>Страна производства:</span> <%# DataBinder.Eval (Container.DataItem, "Country.Name") %>.<br /></p>
<p><span>Производитель:</span> <%# DataBinder.Eval (Container.DataItem, "Manufacturer.Name") %><br /></p>
<p><span>Описание товара:</span> <br/><%# DataBinder.Eval (Container.DataItem, "Description") %></p>
<p><span>В наличии:</span> <%# DataBinder.Eval (Container.DataItem, "Quantity") %> единиц.</p>
<p><span>Стоимость:</span> <%# DataBinder.Eval (Container.DataItem, "Price") %>$.</p>
<asp:ImageButton ID="ImageButton1" runat="server" SkinID="OrderButtonSkin" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "ID") %>'> </asp:ImageButton>
</div>
</div>
</ItemTemplate>
</asp:Repeater>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="rightPanelContentPlaceHolder" runat="server">
</asp:Content>
Catalog.cs:
public partial class Catalog : System.Web.UI.Page
{
protected List<Product> Basket = new List<Product>();
protected List<OrderInfo> BasketOrderInfo = null;
protected void Page_Load(object sender, EventArgs e)
{
var SavedBasket = Session["Basket"] as List<Product>;
if (SavedBasket != null)
{
Basket = SavedBasket;
UpdateBasketProductsCountView();
}
var SavedBasketOrderInfo = Session["BasketOrderInfo"] as List<OrderInfo>;
if (SavedBasketOrderInfo != null)
BasketOrderInfo = SavedBasketOrderInfo;
CategoriesMenu.DataSource = new BusinessLogicComponent().ReadCategories();
CategoriesMenu.DataTextField = "Name";
CategoriesMenu.DataValueField = "ID";
if (CategoriesMenu.Items.Count != (CategoriesMenu.DataSource as List<Category>).Count)
CategoriesMenu.DataBind();
if (SearchTextBox.Text != "")
{
ProductsView.DataSource = new BusinessLogicComponent().FindBy(new Dictionary<string, string>() { { "Name", SearchTextBox.Text.Trim() } });
ProductsView.DataBind();
}
}
protected void CategoriesMenuItemSelected(object sender, EventArgs e)
{
if (CategoriesMenu.SelectedIndex < 0)
return;
var SelectedCategory = (CategoriesMenu.DataSource as List<Category>)[CategoriesMenu.SelectedIndex];
ProductsView.DataSource = new BusinessLogicComponent().FindBy(new Dictionary<string, string>() { { "Category", SelectedCategory.Name } });
ProductsView.DataBind();
SearchTextBox.Text = "";
}
protected void OrderButtonClick(Object Sender, RepeaterCommandEventArgs e)
{
var NewProduct = new ProductsAcces().Read(new Guid((string)e.CommandArgument));
Basket.Add(NewProduct);
if(BasketOrderInfo != null)
BasketOrderInfo.Add(new BusinessLogicComponent().AddToOrder(NewProduct));
UpdateBasketProductsCountView();
}
private void UpdateBasketProductsCountView()
{
BasketProductsCount.Text = Basket.Count.ToString();
if ((Basket.Count % 10 == 0) || (Basket.Count % 10 >= 5) || (Basket.Count / 10 == 1))
BasketProductsCount.Text += " товаров.";
else if (Basket.Count % 10 == 1)
BasketProductsCount.Text += " товар.";
else
BasketProductsCount.Text += " товара.";
}
protected void BasketButtonClick(object sender, EventArgs e)
{
mpe.Show();
if(BasketOrderInfo == null)
BasketOrderInfo = new BusinessLogicComponent().CreateBasket(Basket, (Guid)Membership.GetUser().ProviderUserKey);
BasketGridView.DataSource = BasketOrderInfo;
BasketGridView.DataBind();
}
protected void RegisterOrderButtonClick(object sender, EventArgs e)
{
new BusinessLogicComponent().RegisterOrder(BasketOrderInfo, (Guid)Membership.GetUser().ProviderUserKey);
}
protected void BasketRowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Footer)
{
decimal Totally = 0;
foreach (var O in BasketOrderInfo)
Totally += O.UnitPrice * O.UnitsQuantitty;
e.Row.Cells[3].Text = "Total: " + Totally.ToString("0.00$");
}
}
protected void BasketRowCommand(object sender, GridViewCommandEventArgs e)
{
var OrderInfoID = new Guid(e.CommandArgument as string);
var Info = BasketOrderInfo.Find(x => x.ID == OrderInfoID);
if (e.CommandName == "Remove")
{
Info.UnitsQuantitty--;
if (Info.UnitsQuantitty == 0)
{
BasketOrderInfo.Remove(Info);
Basket.Remove(Info.Product);
UpdateBasketProductsCountView();
}
}
else if (e.CommandName == "Add")
{
Info.UnitsQuantitty++;
}
}
protected void Page_Unload(object sender, EventArgs e)
{
Session.Add("Basket", Basket);
Session.Add("BasketOrderInfo", BasketOrderInfo);
}
}
BusinessLogic.cs:
public class BusinessLogicComponent
{
public List<Category> ReadCategories()
{
var Categories = new CategoryAcces();
return Categories.ReadAll();
}
public Product ReadProduct(string ID)
{
return new ProductsAcces().Read(new Guid(ID));
}
public bool CreateProduct(string Name, string CategoryName, string Description, string CountryName, string Price, string Quantity, string ImageURL, string ManufacturerName)
{
var NewCountry = new CountryAcces().ReadByName(CountryName);
if (NewCountry == null)
{
NewCountry = new Country() { Name = CountryName };
new CountryAcces().Create(NewCountry);
}
var NewManufacturer = new ManufacturerAcces().ReadByName(ManufacturerName);
if (NewManufacturer == null)
{
NewManufacturer = new Manufacturer() { ID = Guid.NewGuid(), Name = ManufacturerName };
new ManufacturerAcces().Create(NewManufacturer);
}
var NewProduct = Product.CreateProduct(Guid.NewGuid(),
new CategoryAcces().ReadByName(CategoryName).ID,
NewCountry.ID, NewManufacturer.ID, Name,
Int32.Parse(Quantity), decimal.Parse(Price), ImageURL);
NewProduct.Description = Description;
return new ProductsAcces().Create(NewProduct);
}
public bool UpdateProduct(string ID, string Name, int CategoryID, string Description, short CountryID, string Price, string Quantity, string ImageURL, Guid ManufacturerID)
{
var UpdatedProduct = new ProductsAcces().Read(new Guid(ID));
UpdatedProduct.Name = Name;
UpdatedProduct.CategoryID = (short)CategoryID;
UpdatedProduct.Description = Description;
UpdatedProduct.CountryID = CountryID;
UpdatedProduct.Price = decimal.Parse(Price);
UpdatedProduct.Quantity = Int32.Parse(Quantity);
UpdatedProduct.ImageURL = ImageURL;
UpdatedProduct.ManufacturerID = ManufacturerID;
return new ProductsAcces().Update(UpdatedProduct);
}
public List<Product> FindBy(Dictionary<string, string> SearchParams)
{
string Query = "SELECT VALUE A FROM Product AS A WHERE";
foreach (var Parameter in SearchParams)
{
switch (Parameter.Key)
{
case "Name":
Query += " A.Name LIKE('%" + Parameter.Value + "%') AND";
break;
case "Decription":
Query += " A.Description LIKE('%" + Parameter.Value + "%') AND";
break;
case "Country":
Query += " A.Country LIKE('%" + Parameter.Value + "%') AND";
break;
case "Category":
var CategoryID= new CategoryAcces().ReadByName(Parameter.Value).ID;
Query += " A.CategoryID = " + CategoryID + " AND";
break;
}
}
Query = Query.Substring(0, Query.Count() - 3) + ";";
return new ProductsAcces().ReadByQuery(Query);
}
public List<OrderInfo> CreateBasket(List<Product> Products, Guid ClientID)
{
var Basket = new List<OrderInfo>();
foreach (var P in Products)
{
Basket.Add(new OrderInfo() { ID = Guid.NewGuid(), ProductID = P.ID, UnitPrice = P.Price, UnitsQuantitty = 1, Product = P});
}
return Basket;
}
public OrderInfo AddToOrder(Product NewProduct)
{
return new OrderInfo() { ID = Guid.NewGuid(), ProductID = NewProduct.ID, UnitPrice = NewProduct.Price, UnitsQuantitty = 1, Product = NewProduct };
}
public void RegisterOrder(List<OrderInfo> Basket, Guid ClientID)
{
var NewOrder = Order.CreateOrder(Guid.NewGuid(), DateTime.Now, 0, "Name", "Adress", "Phone", "Mail");
NewOrder.ClientID = ClientID;
new OrderAcces().Create(NewOrder);
foreach (var Good in Basket)
{
Good.Product = null;
Good.OrderID = NewOrder.ID;
new OrderInfoAcces().Create(Good);
}
}
}