A jedeme dál ...
Človíčkův Weblog aneb Michal Horák bloguje

Programování


ASP.NET MVC 1.díl

 | 5.11.2008

Tak jsem zase po dlouhé době začal zkoumat něco nového v dotnetu. A ejhle ono se mi to zalíbilo :-) Jde o ASP.NET MVC, což je vlastně alternativa k WebForms, s tím že má řadu výhod, ale i nějakou tu nevýhodu.

Hlavními výhodami je striktnější oddělení logiky od prezentace, výsledný výstup je přesně takový jaký chcete a není ničím ovlivněn, lépe se testuje a dělá nám hezké url adresy v adresním řádku.

Nevýhodou oproti webforms je, že si musíme více věcí dělat sami, tedy je to méně pohodlné, ale za to můžeme dostat lepí výsledek.

Základem ASP.NET MVC je návrhový vzor model view controller, který už je známý zhruba tři desítky let, ale v poslední době se znovu ocitá na výsluní díky Ruby on Rails. No a Microsoft nemůže být nikdy pozadu, tak se pustil do ASP.NET MVC. Jak je již z názvu patrné Model View Controller se skládá ze tří částí:

Když si ve Visual Studiu vytvoříme ASP.NET MVC projekt, tak se nám vytvoří adresáře odpovídající jednotlivým částem. Například je možné do adresáře models, vložit LINQ to SQL Classes a můžeme mít hotovo, do adresáře Controllers se vkládají třídy zděděné z System.Web.Mvc.Controller (Zde se budou definovat akce) a nakonec v adresáři View máme aspx soubory, ovšem ještě uložené v adresářích odpovídajícím controllerům.

Pro pochopení základního principu si ukážeme jednoduchý příklad. Půjde o editaci a zobrazení článků. Nejdříve si vytvoříme HomeController.cs a stránku Index.aspx v adresáři Views/Home:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using MVCweb.Models;

namespace MVCweb.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

V controlleru máme funkci Index, která je typu ActionResult a vrací nám pohled na stránku Index.aspx. Tuto funkci, nebo lépe řečeno akci, zavoláme, pokud zadáme do adresního řádku http://www.example.com/Home/Index. Když přidáme další akci, například Create, potom ji zavoláme z url http://www.example.com/Home/Create. Zde je vidět, jak se nám krásně mapují url na akce.

Pro první díl, by to mohlo stačit, příště si ukážeme jaké jsou další možnosti pro akce a také si ukážeme jak zobrazit data z modelu na stránce.

5.11.2008 21:32 | Programování | Komentáře (0) | Trvalý odkaz | 586x | Linkuj.cz

Problém s bindováním dat v aspx stránce

 | 18.5.2008

Opět jsem řešil drobný problém, který ale umí potrápit. Potřeboval jsem do repeateru vložit HyperLink, kde se dynamicky generovala vlastnost NavigateUrl. Nejprve jsem zkoušel toto:

    
        
            
            Odstranit z Blacklistu
        
    

Což se projevilo tak, že se vše vyhodnotilo jako text a teď co s tím? No řešení je opravdu jednoduché stačí malá změna :-)

    
        
            
            Odstranit z Blacklistu
        
    

18.5.2008 11:36 | Programování | Komentáře (0) | Trvalý odkaz | 5075x | Linkuj.cz

Převedení řetězce na datum v C#

 | 15.4.2008

Opět tu mám jednu drobnost, která mě dokázala chvíly potrápit. Šlo o převedení řetězce ve tvaru dd-MM-yyyy na DateTime. Řešení je následující:

DateTimeFormatInfo formatInfo = new DateTimeFormatInfo();
formatInfo.ShortDatePattern = "dd-MM-yyyy";
formatInfo.DateSeparator = ".";

DateTime date = Convert.ToDateTime("15.04.2008", formatInfo);

DateTimeFormatInfo je k nalezení v Namespace System.Globalization, tak na to nezapomeňte :-)

15.4.2008 09:23 | Programování | Komentáře (2) | Trvalý odkaz | 5761x | Linkuj.cz

Simple Captcha v ASP.NET

 | 12.4.2008

Pro školní projekt jsem dnes dělal nějakou jednoduchou verzi Antispamové kontroly Captcha. Udělal jsem to tak, že jsem si vygeneroval kód a alespoň trošku přeházeně a s různými fonty jej vložil do obrázku, kde ještě matu s barevnými obdelníkčky. Kód jsem uložil do Sessions, abych se k tomu následně dostal a mohl vše zkontrolovat.

Zdrojový kód: Captcha.aspx.cs

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

namespace GUI
{
    public partial class Captcha : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Response.ContentType = "image/gif";
            int sirka = 180;
            int vyska = 80;
            string code = GenerateCode();
            Session["code"] = code;
            string[] fonts = new string[4];
            fonts[0] = "Verdana";
            fonts[1] = "Arial";
            fonts[2] = "Arial Black";
            fonts[3] = "Arial Black";

            Random rand = new Random();
            Bitmap image = new Bitmap(sirka, vyska);
            Graphics g = Graphics.FromImage(image);
            Pen pero = new Pen(Color.BurlyWood, 1);

            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.FillRectangle(Brushes.Black, 0, 0, sirka, vyska);
            for (int i = 0; i < 30; i++)
            {
                g.FillRectangle(Brushes.DarkRed, rand.Next(0, sirka), rand.Next(0, vyska), rand.Next(7, 15), rand.Next(7, 15));
                g.FillRectangle(Brushes.DarkGreen, rand.Next(0, sirka), rand.Next(0, vyska), rand.Next(7, 15), rand.Next(7, 15));
                g.FillRectangle(Brushes.Red, rand.Next(0, sirka), rand.Next(0, vyska), rand.Next(7, 15), rand.Next(7, 15));
                g.FillRectangle(Brushes.Green, rand.Next(0, sirka), rand.Next(0, vyska), rand.Next(7, 15), rand.Next(7, 15));
            }

            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
            for (int i = 0; i < 6; i++)
            {
                g.DrawString(code.Substring(i, 1), new Font(fonts[rand.Next(0, 3)], rand.Next(18, 26)), Brushes.White, new Point(i*30, rand.Next(5, 30)));
            }
            image.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
            g.Dispose();
            image.Dispose();
        }

        private string GenerateCode() {
            string znaky = "abcdefghijklmnopqrstuvwxyz0123456789";
            string code = string.Empty;

            Random rand = new Random();
            for (int i = 0; i < 6; i++)
            {
                code += znaky.Substring(rand.Next(0, znaky.Length - 1), 1);
            }
            return code;
        }
    }
}

A ověření je již jednoduché stačí dát:

if (kontrolaTextBox.Text == Session["code"].ToString()){}           

12.4.2008 13:19 | Programování | Komentáře (0) | Trvalý odkaz | 5197x | Linkuj.cz

Jak měnit Master Page z kódu Web Content Formu

 | 1.4.2008

Chvilku jsem si s tímto problémem lámal hlavu, ale docvaklo mi to a tak se můžu podělit. Je to jednoduché. Pro příklad si uděláme Master Page webGui.master, kde bude menu, ve kterém budeme chtít dát vědět, na které stránce jsme.

Otevřeme si soubor webGui.master.cs a přidáme do něj panely s odkazem a ke každému panelu property:

public Panel prvniLink {
    get {
        return PrvniPanel;
    }
    set {
        PrvniPanel = value;
    }
}

V kódu stránky využívající danou Master Page pak těmto property můžeme nastavit CssClass:

((webGui)this.Master).prvniLink.CssClass = "select";

No a už jen stačí pomocí css označit, že je tento odkaz vybraný …

1.4.2008 15:56 | Programování | Komentáře (0) | Trvalý odkaz | 4942x | Linkuj.cz

Visual Studio 2008 - Web Form a Master Page

 | 13.3.2008

Nedávno mě potrápilo nové Visual Studio 2008, to když jsem si chtěl vytvořit web využívající Master Pages, udělal jsem si novou Master Page a založil nový Web Form a hledal jsem kde je to zaškrtávací políčko, kde bych řekl, že chci využít svoji vytvořenou Master Page a ono nikde. Nejdříve jsem si Web Form přepsal ručně, ale to se mi pokaždé dělat nechtělo a tak jsem hledal, no a trvalo to skoro hodinu, než jsem si uvědomil, že nesmím zakládat Web Form ale Web Content Form. Tak pokud máte stejný problém, nebo teprve budete mít, snad jsem pomohl :-)

13.3.2008 17:51 | Programování | Komentáře (2) | Trvalý odkaz | 6761x | Linkuj.cz

Pomalý TableLayoutPanel v .NET 2.0 - Řešení

 | 2.2.2008

Nedávno jsem měl jeden takový malý, nebo možná větší, problémek a ten se podařilo dostatečně vyřešit :-)

Když jsem se snažil do tableLayoutPanelu naskládat spousty labelů, tak to strašně dlouho trvalo, problém byl v tom, že se po každém přidání labelu, celý tableLayoutPanel překreslil. Řešením je nastavit property Visible u tableLayoutPanelu na false a až se vše vyplní, tak vše zobrazit nastavením Visible na true. Jednoduché, primitivní, ale zabralo to spoustu času …

2.2.2008 11:51 | Programování | Komentáře (0) | Trvalý odkaz | 5709x | Linkuj.cz

Pomalý TableLayoutPanel v .NET 2.0

 | 2.1.2008

Již nějakou dobu řeším jeden problém, mám tak dvě stovky informací, které chci přehledně a dynamicky vložit na formulář, každá položka jako jeden label a dataGridView lze špatně formátovat, takže jsem vyzkoušel TableLayoutPanel. Vše v něm vypadá parádně, ale má to velký háček. Než se všechny labely do TableLayoutPanelu vloží, tak to zabere spoustu času a to nemám počítač, který by se s něčím takovým mohl trápit.

Jestliže někdo víte o čem mluvím a podařilo se vám to vyřešit, dejte prosím vědět. Díky a přeji pěkný den :-)

2.1.2008 13:32 | Programování | Komentáře (0) | Trvalý odkaz | 6265x | Linkuj.cz

Čtení dat z Excelu pomocí .NET C#

 | 22.11.2007

Jestliže potřebujete číst data uložená v tabulkách Excelu, pak mám pro vás jednoduchý prográmek v jazyku C#, který toto umí. Samozřejmě, že si jej můžete libovolně upravit podle svých potřeb.

using System;
using System.Collections.Generic;
using System.Text;

/* 
 * Michal Horák http://weblog.clovicek.net 2007
 * 
 * Pro načtení a změnu excelovsakého souboru je
 * potřeba přidat do referencí com Microsoft
 * Excel Object Library, nejlépe tu nejvyšší verzi
 */
namespace readExcel2
{
    class Program
    {
        static void Main(string[] args)
        {
            // Cesta k souboru
            string Path = AppDomain.CurrentDomain.BaseDirectory
                + "List.xls";

            // Vytvoří Aplikační třídu pro práci se souborem
            Excel.ApplicationClass app = new Excel.ApplicationClass();

            /* Otevře soubor, co se týče těch atributů funkce
             * open, tak nemám ponětí co se tam má psát,
             * našel jsem to na netu
             */
 
            Excel.Workbook workBook
                = app.Workbooks.Open(Path, 0, true,
                                     5, "", "", true,
                                     Excel.XlPlatform.xlWindows,
                                     "\t", false, false, 0, true, 1, 0);
            
            // Pracujeme s prvním listem
            Excel.Worksheet workSheet = (Excel.Worksheet)workBook.Sheets[1];
            
            
            int index = 0; //index radku
            int index2 = 2; //index sloupce

            object rIndex = 1; // zacneme na radku 1
            object cIndex = 1; //sloupci 1
            object ColFirst = 1; //sloupci 1
            
            try
            {
                //dokud je neco na radku rIndex a prvnim sloupci
                while (((Excel.Range)workSheet.Cells[rIndex, cIndex]).Value2 != null)
                {
                    rIndex = 1 + index; //pricti radek
                    // dokud je neco na radku rIndex a sloupci ColFirst
                    while (((Excel.Range)workSheet.Cells[rIndex, ColFirst]).Value2 != null)
                    {
                        string retez = ((Excel.Range)workSheet.Cells[rIndex, ColFirst]).Value2.ToString();
                        Console.Write("{0},\t", retez); //vypis políčko [rIndex,ColFirst]
                        ColFirst = index2; //pricti sloupec
                        index2++;
                    }
                    Console.WriteLine();
                    if (index == 0)
                    {
                        Console.WriteLine("-----------------------------------------------");
                    }

                    ColFirst = 1; //nastav sloupec na zacatek
                    index2 = 2;    
                    index++;
                }
            }
            catch (Exception e)
            {
                app.Quit();
                Console.WriteLine(e.Message);
            }
            Console.ReadLine();
        }
    }
}

22.11.2007 18:40 | Programování | Komentáře (9) | Trvalý odkaz | 11136x | Linkuj.cz

Visual C# 2008 Express Edition

 | 20.11.2007

Pro vývojáře, kteří nechtějí platit za licence, vystačí si s omezenou verzí vývojového nástroje pro C# a chtějí využívat nejmodernější Microsoftí technologie, vyšel Visual C# 2008 Express Edition.

Stahovat můžete na adrese http://www.microsoft.com/express/vcsharp/.

Pokud si chcete vyzkoušet kompletní Visual Studio 2008, pak lze stáhnout jeho 90-ti denní trial verze.

20.11.2007 08:53 | Programování | Komentáře (3) | Trvalý odkaz | 8761x | Linkuj.cz

1 | 2 | 3 | Další příspěvky

Tipy na přečtení

Kategorie

Vyhledávání

Odkazy

Fotoblog

Poslední fotgrafie z fotoblogu

Nejčtenější příspěvky za poslední týden

Poslední příspěvky

"A jedeme dál ..." Človíčkův Weblog aneb Michal Horák bloguje. (c) Michal Horák (Človíček webdesign) 2006