ASP.NET MVC
ASP.NET MVC е платформа, създадена от Microsoft, която служи за изработване на уеб приложения, използвайки модела Model-View-Controller ( MVC ). Платформата използва C#, HTML, CSS, JavaScript и бази данни. ASP.NET MVC е съвременно средство за изграждане на уеб приложения, което обаче не замества изцяло уеб формите. Платформата включва изцяло нови тенденции в разработката на уеб приложения, притежава много добър контрол върху HTML и дава възможност за създаване както на малки, така и на големи приложения. ASP.NET MVC може да бъде много лесно тествана и допълвана, защото е изградена от отделни модули, които са изцяло независими едни от други. Платформата е базираха върху приложения, а не върху скриптове ( като PHP например). [1]
Основни концепции
MVC (Model-View-Controller) е шаблон за дизайн, който решава някои основни проблеми като : разделяне на отговорностите в уеб приложенията и преизползване на кода. MVC шаблонът е разработен през 70-те години на 20-ти век от Trygve Reenskaug (скандинавец). Първоначално MVC e бил част от Smalltalk (език за програмиране на десктоп приложения). След това е адаптиран за интернет приложения.
Модел
Моделът представлява множество от класове, които моделират данните, с които работим. Тази концепция е известна още като бизнес логика. В модела може да има и правила, които валидират данните. Той изпълнява ролята на Data Access Layer (слой за достъп до информацията). Достъпът до данните, с които работим, от базата данни се нарича енкапсулиране. Моделът не зависи от конкретното приложение.
Изглед
Изгледът представлява шаблон, по който се генерира потребителския интерфейс. По – конкретно в десктоп приложенията изгледът е множество от контроли (таблици, падащи менюта), които изграждат видимата част за потребителите. В интернет приложенията изгледът работи с определени данни, слага ги в шаблон на HTML, данните се обработват, генерира се готов HTML, който се връща обратно на потребителя.
Контролери
Контролерите са най-важната концепция от MVC. Te са ядрото на всеки Model-View-Controller продукт и определят логиката, по която приложението работи. Контролерите представляват множество от класове, които приемат заявки от потребителя, обработват данните от заявките и връщат краен резултат. Всеки контролер има едно или повече действия.
MVC шаблонът създава приложения, в които различните аспекти (входна логика, бизнес логика и интерфейс логика) са разделени, като същевременно осигурява свободно взаимодействие между различните елементи. Шаблонът определя къде да бъде съхранена всеки вид логика в приложението. Интерфейс логиката принадлежи на изгледа. Входната логика принадлежи на контролите, докато бизнез логиката принадлежи на модела. Това разделение помага в случай на по-сложно приложение, защото позволява на програмиста да се фокусира само върху един аспект от имплементацията. Например, може да се фокусираме върху изгледа, без да се интересуваме от бизнес логиката. Свободното взаимодействие между тези три компоненти в MVC приложенията дават възможност за паралелно изграждане. Например, трима различни програмисти могат да работят върху трите компоненти по едно и също време.[2]
Контролери и действия
Какво са контролери
Контролерите са класове, които се създават в MVC приложинието. Намират се в папка Controllers. Всеки един клас ,който е от този тип, трябва да има име завършващо с наставка "Controller". Контролерите обработват постъпващите заявки, въведени от потребителя и изпълняват подходящата логика за изпълнение на приложението. Класът контролер е отговорен за следните етапи на обработка:
* Намиране и извикване на най-подходящия метод за действие (action method) и валидиране, че може да бъде извикан. * Взимането на стойности, които да се използват като аргументи в метода за действие. * Отстраняване на всички грешки, които могат да възникнат по време на изпълнението метода за действие. * Осигуряване на клас WebFormViewEngine по подразбиране за отваряне на страници с изглет от тип ASP.NET.
За да създадем контролер натискаме дясното копче на мишката върху папката "controllers" в прозореца "solution explorer" на Visual Studio, избираме "add" и след това "controller".

След появяването на прозореца "Add controller" трябва да се въведе име на контролера. То трябва да завършва с наставката "controller".

Контролера е клас който се наследява от базовия клас System.Web.Mvc.Controller. Всеки публичен метод в контролера е показан като "controller action". Ако искаме даден метод да не бъде извикан ,трябва да сложим "NonAction" атрибут върху неговото име.По подразбиране "Index()" действието е извикано за контролера , когато друго такова не е изрично упоменато.
using System;
using System.Collection.Generic;
using System.Linq;
using System.Web;
using System.Web.MVC;
namespace ControllerApplication.Controllers
{
public class TestingController : Controller
{
//
// GET: /Testing/
public ActionResult Index() //Default Action
{
return View();
}
}
}

Методи за действие
В ASP.NET приложения, които не ползват MVC Framework, взаимодействията с потребителя са организирани и контролирани чрез страници . За разлика от това в приложения с MVC framework взаимодействията с потребителя са организирани чрез контролери и методи за действие. Контролерът определя метода за действие и може да включва толкова методи за действие,колкото са необходими.
Методи за действие обикновено имат функции ,които са пряко свързани с взаимодействието с потребителя. Примери за взаимодействие с потребителите са въвеждане на URL адрес в браузъра, кликване върху линк, и подаването на формуляр. Всяко едно от тези потребителски взаимодействия изпраща заявка към сървъра. Във всеки един от тези случаи, URL адреса от заявката съдържа информация, която MVC Framework използва за да включи метод за действие.[4]
using System;
using System.Collection.Generic;
using System.Linq;
using System.Web;
using System.Web.MVC;
namespace ControllerApplication.Controllers
{
public class TestingController : Controller
{
//
// GET: /Testing/
public ActionResult Index() //Default Action
{
return View();
}
public ActionResult Testing1()
{
return View();
}
public ActionResult Testing2(string x)
{
return View();
}
}
}
В посочения горе пример имаме три действия (Index,Testing1,Testing2),които са дефинирани в контролер клас "TestingController". За да извикаме различни действия , трябва да напишем следното в полето за адреси:
Начин на изписване: /{controller}/{action}/{id}
- /TestingController/Index :- Извиква Index() действие.
- /TestingController/Testing1 :- Извиква Testing1() действие.
- /TestingController/Testing2/pijush :- Извиква Testing2() действие с "pijush" за Id параметър.
- /TestingController :- Извиква Index() действие.
Списък резултати от дейстия.
Action Results
- View():- Представлява ASP.NET MVC изглед т.е., когато вашия браузър връща HTML. Това е най-рапространения "ActionResult" ,който може да върне един контролер.
- PartialView():- Извиква част от ASP.NET MVC изгледа.
- RedirectToAction():- Пренасочва от едно контролер действие в друго. Параметри с които може да се изполва това действие са:
-actionName: Името на действието. -controllerName: Името на контролера. -routeValues: Стойностите които са предадени на действието.
Метода RedirectToAction() връща "302 found HTTP" статус код на браузъра ,за да може да направи пренасочването към новото действие. Едно от предимствата на това действие е ,че когато се прави пренасочване в браузъра - полето за адреси се обновява с новия URL линк. Недостатък е ,че трябва да се направи повторна заявка от браузъра към сървъра.
- Redirect():- Пренасочва към друг контролер или URL линк.
- Content():- Данни които постъпват към браузъра. Параметрите ,които могат да се използват като аргументи, са:
-string: Изобразява string на браузъра. -contentype: Типът MIME на данните (по подразбиране за text/html). -contentEncoding: Текстовото кодиране на данните (например:-Unicode или ASCII)
- Json():- JavaScript object Notation (JSON) e изобретен от Douglas Crockford като по-лека алтернатива на XML за пращане на данни по интернет в Ajax приложения. Метода Json() използва клас в .NET framework наречен JavaScriptSerializer за да преобразува обект в JSON репрезентация.[5]
- File():- Връщане на фаил от действие. Този метод приема следните параметри:
-filename, contentType, fileDownloadName, fileContents, fileStream.
- JavaScript():- Представлява JavaScript фаил.
- HandleUnknownAction():- Този метод се извиква автоматично когато контролера не може да намери ресурс. По подразбиране метода изкарва грешка "404 resource Not Found". Съобщението за грашка може да бъде сменено с друго ,това обаче изисква да се пренапише контролер класа.
Валидация
Какво е валидиране
Валидирането на входните данни, въведени от потребителя (user input), позволява да се уверим, че те съответстват на модела на данните в ASP.NET MVC. По този начин се защитава приложението от потребителски грешки или злонамерени потребители. Има много начини да се включи валидиране в едно MVC приложение. Например, може да бъде използвана публично достъпна библиотека за валидиране, като Microsoft Enterprise Library Validation Block.
Как работи валидирането
Когато потребителят потвърди (submit) формуляр(form), данните от формуляра се предават на метод за действие (action method) с помощта на ViewDataDictionary колекция. ViewDataDictionary има ModelState свойство(property), което съдържа колекция от ModelState обекти. За всеки модел, който е дефиниран в MVC приложението, се създава съответния ModelState обект и добавя в колекцията. Действието, което получава данните от формуляра определя правилата за проверка, прилагани към формуляра с данни. Ако правилото е нарушено, действието използва ModelState свойство за да предаде информация за грешка обратно към изгледа.
Пример за валидация
Примерът показва клас Person, който дефинира свойства (properties) за съхраняване на лични данни:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zipcode { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
}
Следното дефинира форма за въвеждане на стойности и създаване на инстанция на класа Person. Ако потребителят въведе невалидна стойност за инстанцията на Person, изгледът се генерира отново, този път със съобщение за грешка, което е подадено на изгледа от свойство на ModelState:
<h2>Create</h2>
<%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>
<% using (Html.BeginForm()) {%>
<fieldset>
<legend>Fields</legend>
<p>
<label for="Name">Name:</label>
<%= Html.TextBox("Name") %> Required
<%= Html.ValidationMessage("Name", "*") %>
</p>
<p>
<label for="Age">Age:</label>
<%= Html.TextBox("Age") %> Required
<%= Html.ValidationMessage("Age", "*") %>
</p>
<p>
<label for="Street">Street:</label>
<%= Html.TextBox("Street") %>
<%= Html.ValidationMessage("Street", "*") %>
</p>
<p>
<label for="City">City:</label>
<%= Html.TextBox("City") %>
<%= Html.ValidationMessage("City", "*") %>
</p>
<p>
<label for="State">State:</label>
<%= Html.TextBox("State") %>
<%= Html.ValidationMessage("State", "*") %>
</p>
<p>
<label for="Zipcode">Zipcode:</label>
<%= Html.TextBox("Zipcode") %>
<%= Html.ValidationMessage("Zipcode", "*") %>
</p>
<p>
<label for="Phone">Phone:</label>
<%= Html.TextBox("Phone") %> Required
<%= Html.ValidationMessage("Phone", "*") %>
</p>
<p>
<label for="Email">Email:</label>
<%= Html.TextBox("Email") %> Required
<%= Html.ValidationMessage("Email", "*") %>
</p>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% } %>
<div>
<%=Html.ActionLink("Back to List", "Index") %>
</div>
Ако възникне грешка при валидирането, методът за действие извиква метода AddModelError за да добави грешката в свързания обект ModelState. След като се изпълнят правилата за валидиране, методът за действие използва свойството IsValid на колекциата ModelStateDictionary за да се определи дали получената информация е в съответствие с модела:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Person person)
{
if (person.Name.Trim().Length == 0)
{
ModelState.AddModelError("Name", "Name is required.");
}
if (person.Age < 1 || person.Age > 200)
{
ModelState.AddModelError("Age", "Age must be within range 1 to 200.");
}
if ((person.Zipcode.Trim().Length > 0) && (!Regex.IsMatch(person.Zipcode, @"^\d{5}$|^\d{5}-\d{4}$")))
{
ModelState.AddModelError("Zipcode", "Zipcode is invalid.");
}
if (!Regex.IsMatch(person.Phone, @"((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}"))
{
ModelState.AddModelError("Phone", "Phone number is invalid.");
}
if (!Regex.IsMatch(person.Email, @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$"))
{
ModelState.AddModelError("Email", "Email format is invalid.");
}
if (!ModelState.IsValid)
{
return View("Create", person);
}
people.Add(person);
return RedirectToAction("Index");
}
Изгледи
Какво е изглед
Изгледите са тези, които определят как ще бъде визуализиран потребителският интерфейс (UI) на приложението. В ASP.NET MVC се поддържат средства (engines) за генериране на изгледи.
Начин на работа на изгледите
Когато потребителт взаимодейства с изглед, данните се рутират от изгледа до метод за действие, който от своя страна може да създаде друг изглед. Едно MVC приложение може да има няколко контролери, всеки от които може да съдържа множество методи за действие, а всяко действие може да създаде различен изглед. Изгледите са организирани в папки, като името им се определя от това на свързания контролер (например изгледите от HomeController са в папката \Views\Home).
Добавяне на изглед на MVC приложение в Visual Studio
1.В Solution Explorer, щракнете с десния бутон на мишката върху папката, която носи името на нужния ви контролер. Например ако контролерът е с име HomeController, щракнете с десния бутон върху папката Home. 2.Натиснете Add, след което View. Отваря се следният диалогов прозорец:

3.Попълнете име, вид изглед и т.н, в зависимост от това какъв изглед искате да създадете. 4.Натиснете Add
Рутиране
Какво е рутиране
Рутирането е метод за валидация и обработка на заявката от потребителя. След като рутирането получи заявката, то проверява дали тази заявка отговаря на рутиращите шаблони и ако бъдат намерени съответствия, първият физически поставен в кода шаблон, отговарящ на дадената заявка, изпълнява функции за подаване на данните от заявката към съответните контролери, действия и параметри.
Как се регистрира и дефинира рутирането
При стартиране на ASP.NET MVC приложението първият файл, който се стартира, се нарича "Global.asax" и съответно в него първият метод, който се извиква, е с име "Application_start()".Във този метод има фунции за регистрация на Area, WebApi, Filters, Routing и Bundle. Именно тук се регистрира и нашето рутиране (Routing) чрез извикване на класа RoutingConfig, през метода RegisterRoutes и през него се регистрира рутирането в глобалната таблица RouteTable.
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
}
}

За да дефинирате рутиранете е нужно да конфигурирате файла RouteConfig.cs, който се намира в папката App_Start заедно с останалите Config файлове.
Тук вече се конфигурира метода RegisterRoutes, който се извиква от "Global.asax" файла. Този метод използва глобална таблица, която може да бъде извикана отвсякъде в нашето приложение и в нея има методи IgnoreRoute и MapRoute. IgnoreRoute методът се използва за да се пренебрегнат заявки, които не желаем да обработим. Чрез метода MapRoute ние регистрираме нашето рутиране като то си има име, url-шаблон и стойности по подразбиране.
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new {
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}
};
}
Шаблоните в рутирането са case-insensitive, което означава, че шаблонът ще разпознае данните без значение дали са с малки или главни букви. Ако при заявката никой от шаблоните не бъде обхванат, то тогава сървърът връща error-404.
Дебъгване на рутирането
ASP.NET MVC ни предоставя готов дебъгер който може да свалим през NuGet packege и в него потърсите RouteDebugger.

Дебъгерът се появява отдолу на страницата след нейното стартиране.

Ако желаете той да бъде спрян, е нужно да отворите Web.Config файла на вашето приложение и във него да промените този ред "<add key="RouteDebugger:Enabled" value="true" />", като смените стойността value да е равна на false (<add key="RouteDebugger:Enabled" value="false" />).
<appSettings>
<add key="webpages:Version" value="1.0.0.0" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="RouteDebugger:Enabled" value="true" />
</appSettings>
История
Първа поява
За пръв път ASP.NET MVC е била представена през октомври 2007г от Скот Гътри на първата ALT.NET конференция в Остин, Тексас. Въпреки че Гътри заявява в своя блог[9], че ASP.NET MVC ще бъде пусната в употреба като напълно поддържана функция на ASP.NET през първата половина на 2008 , първата официална версия на продукта се появява на 13 март 2009г.
Апаче лиценз 2.0
През март 2012г. Скот Гътри съобщава в блогa[10] си, че Microsoft са пуснали версия на техния уеб пакет включващ ASP.NET MVC, Web API и ASP.NET Web Pages (още наричан Razor) под лиценза на Apache 2.0.
История на версиите
Дата | Версия |
---|---|
13 Март 2009 | ASP.NET MVC 1.0[11] |
16 Декември 2009 | ASP.NET MVC 2 RC[12] |
4 Февруари 2010 | ASP.NET MVC 2 RC 2[13] |
10 Март 2010 | ASP.NET MVC 2[14] |
6 Октомври 2010 | ASP.NET MVC 3 Beta[15] |
9 Ноември 2010 | ASP.NET MVC 3 RC[16] |
10 Декември 2010 | ASP.NET MVC 3 RC 2[17] |
13 Януари 2011 | ASP.NET MVC 3[18] |
13 Септември 2011 | ASP.NET MVC 4 Developer Preview[19] |
14 Февруари 2012 | ASP.NET MVC 4 Beta[20] |
31 Май 2012 | ASP.NET MVC 4 RC[21] |
15 Август 2012 | ASP.NET MVC 4[22] |
26 Юни 2013 | ASP.NET MVC 5 Preview [23] |
Източници
- ↑ http://academy.telerik.com/school-academy/2012-2013/programming-with-asp-net-mvc
- ↑ http://www.asp.net/mvc/tutorials/older-versions/overview/asp-net-mvc-overview
- ↑ http://www.codeproject.com/Articles/595024/Controllers-and-Actions-in-ASP-NET-MVC
- ↑ http://msdn.microsoft.com/en-us/library/dd410269(v=vs.98).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1
- ↑ https://en.wikipedia.org/wiki/Douglas_Crockford
- ↑ http://msdn.microsoft.com/en-us/library/dd410404(v=vs.90).aspx
- ↑ http://msdn.microsoft.com/en-us/library/dd410403(v=vs.90).aspx
- ↑ http://academy.telerik.com/school-academy/2012-2013/programming-with-asp-net-mvc
- ↑ http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx
- ↑ http://weblogs.asp.net/scottgu/archive/2012/03/27/asp-net-mvc-web-api-razor-and-open-source.aspx
- ↑ http://go.microsoft.com/fwlink/?LinkId=144444
- ↑ http://haacked.com/archive/2009/12/16/aspnetmvc-2-rc.aspx
- ↑ http://haacked.com/archive/2010/02/04/aspnetmvc2-rc2.aspx
- ↑ http://weblogs.asp.net/scottgu/archive/2010/03/11/asp-net-mvc-2-released.aspx
- ↑ http://www.asp.net/whitepapers/mvc3-release-notes
- ↑ http://www.asp.net/whitepapers/mvc3-release-notes
- ↑ http://www.asp.net/whitepapers/mvc3-release-notes
- ↑ http://www.asp.net/whitepapers/mvc3-release-notes
- ↑ http://haacked.com/archive/2011/09/13/asp-net-mvc-4-developer-preview-released.aspx
- ↑ http://www.microsoft.com/en-us/download/details.aspx?id=28942
- ↑ http://blogs.msdn.com/b/webdev/archive/2012/05/31/new-features-for-web-development-in-visual-studio-2012-rc.aspx
- ↑ http://blogs.msdn.com/b/webdev/archive/2012/08/15/visual-studio-2012-rtw.aspx
- ↑ http://www.asp.net/mvc/tutorials/mvc-5/introduction/getting-started