

ASP.NET MVC
MVC гэж юу вэ?
Asp.net вэб хөгжүүлэгчдэд зориулагдсан стандарт вэбийг цаашид хөгжүүлэхэд илүү амар хялбар болж өгсөн бөгөөд MVC нь давхарга буюу Layerууд хоорондын хараат байдлыг багасгасан юм.
MVC гэж юу вэ? Хэний бүтээл вэ?
MVC гэдэг нь ModelViewController гэсэн үгний товчлол юм. Энэ загвар шийдэл нь давхрага хоорондын холбоог багасгасан нь илүү хүчирхэг, цаашид хөгжүүлэхэд нэн тохиромжтой болгожээ.ASP.net MVC нь ASP.net Web Applicationii framework –н компонэнт бөгөөд вэб хөгжүүлэгчидэд MVC паттернийг ашиглах боломжтой. MVC нь Microsoft-эд бүтээгдээгүй юм. (http://en.wikipedia.org/wiki/Model-view-controller )
MVP гэж юу вэ? MVC –с хэр ялгаатай вэ?
MVP (Model-View-Presenter) ба MVC (Model-View-Controller)хоёула давхарга хоорондын хамааралыг холбоотой ажиллах байдлыг нь багасгаж өгсөн.
Ерөнхийдөө MVP нь MVC-тэй төстэй. MVP нь компонентэд суурилсан График Юнит Интерфэйс аппликэшн /*GUI application*/ -д илүү тохиромжтой.
MVC-гийн зарим ашигтай талууд юу вэ?
- Вэб хөгжүүлэхэд илүү хялбар болсон
- Шинэ хүчирхэг шийдэлтэй вэб хийж боломжтой болсон.
- MVC нь ASP.Net-н хэсэг учраас нэмэлт Built-in –х хангагдана.
- Өөр дээрээ Тест хийх боломжоор хангагдсан тул илүү бодитой найдвартай болсон.
Asp.net Web Forms VS Asp.net MVC хооронд нь жишвэл?
Хөгжүүлэгч хүн эдгээр 2ийн аль алин дээр нь ажиллаж болно гэхдээ шийдэл нь 2өөр замаар хийгдэж байгаа гэдэгт оршино.
Хэрэв Asp.net Web Formийг сонгосон бол Та:
- Илүү хураангуй контролд дуртай .
- Найдвартай ажиллахаас илүү Вэбээ хурдан хийхийг зоридог .
- Inline code бичихээс зайлхийхыг хүсдэг бол.
- МVC загварыг илүүд үзэхгүй байгаа бол та Asp.Net Web Forms ,Page controller.-ийг сонгож болно.
Ажиллах процессийг ойлгох:
Юуны өмнө web request-г UrlRoutingModule-аар дамжуулна. Энэ нь HTTP module юм. Module нь хүсэлтийг задлан route хэсэг рүү оруулдаг. UrlRoutingModule object нь эхний route objectийг сонгож тухайн хүсэлттэй харьцуулалт хийж тохируулна. Хэрэв тохирох хүсэлт олдохгүй бол UrlRoutingModule object юу ч хийхгүй.
URL заавал тааруулах:
.Net Web Form application Active Server Page нь URL хаяг нь зайлшгүй таарч байх ёстой байдаг. Энэ юуг хэлээд байна гэхээр SomePage.aspx гэж хуудас /web/SomePage.aspx заавал байх хэрэгтэй байдаг. Гэтэл энэ хуудас нь байхгүй байвал өнөөх Page Not Fount – 404 гэсэн хуудсыг харуулдаг. Харин MVC –н хувьд URL хуудасанд хариу өгөхийн оронд контроллер-н үйлдэлд хариу өгдөг болсон байна.
ASP.net Web form – mapped to page.
ASP.net MVC – mapped to controller action.
Ажиллах үйл явц:
1- Вэб аппликешнээс хүсэлт хүлээн авна. – Энэ нь Global.asax файл дотор , Route objectууд нь RouteTable object рүү хийнэ.
2- Routing хийнэ./чиглүүлнэ./- UrlRoutingModule нь RouteData Object.g үүсгэхийн тулд RouteTable collection.д байгаа хамгийн эхний Route Objectийг харьцуулдаг.Энэ нь RequestContext Object-г үүсгэдэг.
3- MVC хүсэлт гүйцэтгэгч үүсгэнэ. MVC request handler – Энэ нь MvcRouteHandler object нь MvcHandler class-н хуулбарыг үүсгэдэг дараа нь үүнийгээ RequestContext рүү дамжуулдаг.
4- Controller үүсгэнэ.
5- Execute Controller –ийг ажиллуулна. MvcHandler нь controller-ийн Execute method-ийг дуудаж ажиллуулна.
6- Үйлдэл дуудах. Invoke action. – Ихэнх controllerууд Controller base классаас удамшсан байдаг.Энэ ControllerActionInvoker ч бас мөн адил юм байна.
7- Execute Result. – Execute ажиллаад бас л return result as type many гэж буцаана./*ViewResult, RedirectToRouteResult, RedirectResult, ContentResult, JsonResult, ба EmptyResult. */
Asp.Net Routing ойлгох:
Asp.net Routing орж ирсэн хүсэлтүүдийг шийдэхийн тулд Routing Table ашигладаг. Routing Table нь таны вэб аппликешн анх ачааллагдах үед үүсдэг. Энэ нь Global.asax file.д байна.
Global.asax file:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication1
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
routes.MapRoute(
“Default”, // Route name
“{controller}/{action}/{id}”, // URL with parameters
new { controller = “Home”, action = “Index”, id = “” } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}
Жишээ нь:
1. Контроллерийн эхний сегмэнтэд = контроллерийн нэр
2. Хоёр дахь сегмэнтэд = үйлдэл /*асtion*/
3. Сүүлийн сегмэнтэд = ID байрлана.
Контроллерийг ойлгох: Controller
Контроллер нь хэрэглэгч MVC тэй харилцан ажиллаж удирдана. Хэрэглэгч ямар хүсэлт явуулахаас шалтгаалан буцаж хариу үйлдэл хийхээ тодорхойлно.
Контроллер нь ердөө л класс юм байна.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
ViewData["Title"] = “Home Page”;
ViewData["Message"] = “Welcome to ASP.NET MVC!”;
return View();
}
public ActionResult About()
{
ViewData["Title"] = “About Page”;
return View();
}
}
}
Энд index(),about() гэсэн 2 method харагдаж байна. Хоёр үйлдэлд хариу үзүүлнэ.
View-ийг ойлгох:
Түрүүийн хоёр метод хоёулаа View буцааж байгаа.View нь HTML markup агуулж байдаг бөгөөд броузер руу агууллагыг илгээнэ.View нь ажиллахдаа яг зөв замд байрлаж ажиллуулах хэрэгтэй юм байна.
Жишээ нь:
HomeController : Controller нь
/HOME/Index = HomeController.Index()
/HOME/About = HomeController.About() гэж ойлгож болно.About нь мөн адил .
Харин view-н хувьд зам нь \views\home\Index.aspx гэж харагдах учир зам өөрчлөгдвөл ажиллахгүй байх аюултай юм.
Routing дээр нэмэлт ойлголт:
Энэ хэсэгт MVC –н нэмэлт хэрэгтэй гэсэн ойлголтуудыг багтаана.
- Шинээр Asp.net MVC application үүсгэхэд application routing хийхэд автоматаар тохируулагдсан байдаг. Routing тохиргоо нь 2 газар байдаг.
- Эхнийх нь , web.config.t байна.
- Үүнд:
system.web.httpModules
system.web.httpHandlers
system.webserver.modules
system.webserver.handlers
гэсэн бүлэг байна.
- Хоёр дахь нь,Global.asax файлд route table үүсдэг.Энэ Global.asax файлд нь онцгой чухал event handler агуулагдана.Аpplication Start() event ажиллах үед route table үүсдэг.
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- using System.Web.Routing;
-
- namespace MvcApplication1
- {
- // Note: For instructions on enabling IIS6 or IIS7 classic mode,
- // visit http://go.microsoft.com/?LinkId=9394801
-
- public class MvcApplication : System.Web.HttpApplication
- {
- public static void RegisterRoutes(RouteCollection routes)
- {
- routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
-
- routes.MapRoute(
- “Default”, // Route name
- “{controller}/{action}/{id}”, // URL with parameters
- new { controller = “Home”, action = “Index”, id = “” } // Parameter defaults
- );
-
- }
-
- protected void Application_Start()
- {
- RegisterRoutes(RouteTable.Routes);
- }
- }
- }
controller = Home
action = Index
id = 3
Энэдээс харахад Аpplication_Start()-аас RegisterRoutes.ийг ачааллаж байна. Броузерээс ирсэн хүсэлтийг дамжуулна. Контроллер эхний секшионд харин хоёр дахид нь акшион ,сүүлийнхэд нь ID орж байна.
Хүсэлт ингэж ирсэн байна. URL /Home/Index/3
Хэрэв контроллерийг дүүргээгүй бол систем автоматаар HOME гэж хийж өгнө.Хэрэв action.ийг дүүргэж өгөөгүй бол автоматаар Index гэж хийж өгнө. Хэрэв ID.ийг дүүргэж өгөөгүй бол автоматаар null дүүргэгдэх болно.
Энэ нь өнөөх 404 хуудасыг гаргаж өгдөггүй түлхүүр нь юм болов уудаа.
Контроллерийг үүсгэхдээ:
1.public ActionResult Index()
{
return View();
}
2.public ActionResult Index(string id)
{
return View();
}
3.public ActionResult Index()
{
return View();
}
4.public ActionResult Index(int? id)
{
return View();
}
5.public ActionResult Index(int id)
{
return View();
}
Гэхдээ 5, шиг параметр авахаар контроллерээ зарлачаад хоосон утга өгчихвэл мэдээж алдаа өгч таарах нь байна.
Өөрийн Route үүсгэх:
Global.asax файлд байгаа default route tableийг яаж өөрчлөхийг үзүүлэе.
Ихэнх MVC application-д Default route table нь зүгээр аюулгүй ажилладаг.Гэхдээ , ямар нэгэн тохиолдолд өөрчлөх шаардлага гарна.
Жишээ татая:
Building Blog application байж гэж төсөөл, Броузерээс ирэх хүсэлт ийм байдалтай ирнэ: /archive/12-11-2008/
Тэгэхээр 12-11-2008 гэсэн хүсэлтэд хариу өгөх хэрэгтэй болно.
Default route table нь::
Routes.mapRoute(
“Default”,
“{controller}/{action}/{id}”,
New { controller= ‘Home”, action = “Index”,id=””}
)
Харин өөрийн үүсгэсэн route table:
Routes.mapRoute(
“Blog”,
“Archive/{entryDate}”,
New { controller= ‘Archive”, action = “Entry” }
)
Үүнийг үүсгэхэд дараалал нь их чухал юм. Учир нь Default route table.ийн өмнө нь өөрийн үүсгэсэн routetable.ээ оруулахгүй бол үргэлж default route дуудагдан ажилласаар байх болно.
/Archive/12-25-2009
/Archive/10-6-2004
Гэж хүсэлт ирвэл Archive контроллероос Entry() үйлдэл дуудагдана.
namespace MvcApplication1.Controllers {
public class ArchiveController : Controller {
public string Entry(DateTime entryDate)
{ return “You requested the entry from ” + entryDate.ToString(); }
}
}
Тогтмол route table :
Хэрэв тогтмол үүсгэсэн route Table.ээс action дуудагдахдаа:
routes.MapRoute(
“Product”,
“Product/{productId}”,
new {controller=”Product”, action=”Details”}
);
Контроллерээс Details() дуудагдана:
Using System.Web.Mvc
Namespace MvcApplication1.Controllers
{
Public class ProductController : Controller
{
Public ActionResult Details(int ProductID)
{
Return View();
}
}
}
Ингэж дуудагдах үед хүсэлт
/details/product/23 эсвэл /details/prodect/1 гэж дуудвал тохирох хүсэлт амжилттайгаар дуудагдана. Харин хүсэлтийг /details/product/sagsgdsagdasd гэж өгвөл Details(int productID) гээд өгсөн тул string орж ирэхэд алдаа урт гэгч нь улаан бичиг харуулна.
Үүнээс яаж зайлсхийх вэ?
Regular expression бичих хэрэгтэй юм.
routes.MapRoute(
“Product”,
“Product/{productId}”,
new {controller=”Product”, action=”Details”},
new {productId = @”\d+” }
);
Ингэж бичсэн тохиолдолд зөвхөн тохирох int хүсэлтийг л харуулна. Алдаа бичиг гарахгүй гэсэн үг юм.
Controller дээр нэмэлт ойлголт:
http://localhost/Product/Index/3
гэж хүсэлт ирлээ хэмээн төсөөл,Энэ тохиолдолд ProductController.ийн Index() дуудагдана.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
namespace MvcApplication1.Controllers
{
public class ProductController : Controller
{
//
// GET: /Products/
public ActionResult Index()
{
// Add action logic here
return View();
}
}
}
Ингэж дуудахын тулд Index() method.ийг заавал Publicаар зарлах хэрэгтэй. Үүийг сайн анхаарах нь зүйтэй учир нь defaultaar private гэж үүсдэг юм.
Буцаж ирэх result types:
1. ViewResult – Represents HTML and markup.
2. EmptyResult – Represents no result.
3. RedirectResult – Represents a redirection to a new URL.
4. JsonResult – Represents a JavaScript Object Notation result that can be used in an AJAX application.
5. JavaScriptResult – Represents a JavaScript script.
6. ContentResult – Represents a text result.
7. FileContentResult – Represents a downloadable file (with the binary content).
8. FilePathResult – Represents a downloadable file (with a path).
9. FileStreamResult – Represents a downloadable file (with
Эдгээр бүгд ActionResult class.аас удамшсан result болно. Ер нь бол ихэнхдээ view.g буцааж байгааг ажигласан байх. Яахав ViewResult ni Browser рүү HTML ийг буцааж байгаа юм. Харин view нь өөрөө дээрээс аль тохиромжтойг буцаана .
Controller үүсгэх:
Энэ хэсэг контроллер яаж үүсгэхийг харуулна.


Контроллерийг үүсгэж нэрлэхдээ заавал сүүлийн suffix нь Controller гэж бичигдэх ёстой. Мөн үүсгэсэн контроллероо Controller folder-т хийхээ мартаж болохгүй. /Үүнийг сайн анхаарах хэрэгтэй юм шүү /
Жишээ нь : ProductController гэхийг Product гээд нэрлэчихэж болохгүй гэсэн үг.

Доорх check.g дарснаар автоматаар action methoduud нь үүснэ гэсэн үг.
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
namespace MvcApplication1.Controllers
{
public class CustomerController : Controller
{
//
// GET: /Customer/
public ActionResult Index()
{
return View();
}
//
// GET: /Customer/Details/5
public ActionResult Details(int id)
{
return View();
}
//
// GET: /Customer/Create
public ActionResult Create()
{
return View();
}
//
// POST: /Customer/Create
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
{
try
{
// TODO: Add insert logic here
return RedirectToAction(“Index”);
}
catch
{
return View();
}
}
//
// GET: /Customer/Edit/5
public ActionResult Edit(int id)
{
return View();
}
//
// POST: /Customer/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection collection)
{
try
{
// TODO: Add update logic here
return RedirectToAction(“Index”);
}
catch
{
return View();
}
}
}
}
Action үүсгэх:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public string SayHello()
{
return “Hello!”;
}
}
}
гээд үүсгэчихэж action үүсгэж зарлахдаа
Public байж болно.
Static,extention,constructor,getter,setter,open generic types, байж болохгүй.
Ref or out parameterийг агуулсан байж болохгүй.
Action нь буцаахдаа string,Datetime,instance of the class ба void .ийг буцаана.
Бас нэг анхаарах зүйл юу гэхээр DeleteMyWebSite() гэсэн action үүсгэж огт болохгүй учир нь Интернэтэд холбогдсон хэн бүхэн таны action.ийг дуудаж ажиллуулж болно.
VIEW дээр нэмэлт ойлголт:
Энэ хэсэгт ASP.net MVC View, View Data, ба HTML helpers ийн талаар хураан ойлголтыг өгнө.
View үүсгэх ,контроллероос датаг яаж View рүү дамжуулах, HTML Helpersийг Viewрүү гаргаж ажиллуулахыг үзэе.
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult Details()
{
return RedirectToAction(“Index”);
}
}
}
Үүнийг броузерээс дуудахдаа /Home/Index гэж дуудна.
View.t content нэмэх:
\Views\Home\Index.aspx
(%@ Page Language=”C#” Inherits=”System.Web.Mvc.ViewPage” %)
(!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”)
(title)Index(/title)
(/head)
(body)
(div)
The current date and time is
(% Response.Write(DateTime.Now);%)
(/div)
(/body)
(/html)
(% Response.Write(DateTime.Now);%) гэж оруулж болно . (% %) гэсэн делиметр ашиглана.
View.t content-д HTML Helpers ашиглах:
(%@ Page Language=”C#” Inherits=”System.Web.Mvc.ViewPage” %)
(!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”)
(title)Login Form(/title)
(/head)
(body)
(div)
(% using (Html.BeginForm())
{ %)
(label for=”UserName”)User Name:(/label)
(br /)
(%= Html.TextBox(“UserName”) %)
(br /)(br /)
(label for=”Password”)Password:(/label)
(br /)
(%= Html.Password(“Password”) %)
(br /)(br /)
(input type=”submit” value=”Log in” /)
(% } %)
(/div)
(/body)
(/html)
Html helpers нь string , болон HTML elements болох textbox,dropdown гэх мэтийг боловсруулж ажиллуулна.

View Data ашиглах:
Өгөгдлийг контроллероос view рүү дамжуулдаг.
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class ProductController : Controller
{
public ActionResult Index()
{
ViewData["message"] = “Hello World!”;
return View();
}
}
}
Хуудасдаа авч харахдаа :
(%@ Page Language=”C#” Inherits=”System.Web.Mvc.ViewPage” %)
(!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”)
(title)Product Index(/title)
(/head)
(body)
(div)
(%= Html.Encode(ViewData["message"]) %)
(/div)
(/body)
(/html)
HTML Helpers :
HTML helpers нь методтой адил string буцаадаг.
Энэ бүрэн жагсаалт биш ч гэсэн эдгээрийг MVC д ашиглана:
• Html.ActionLink()
• Html.BeginForm()
• Html.CheckBox()
• Html.DropDownList()
• Html.EndForm()
• Html.Hidden()
• Html.ListBox()
• Html.Password()
• Html.RadioButton()
• Html.TextArea()
• Html.TextBox()
MVC-ийг ашиглах :

Өөрийн прожектийг үүсгэнэ.Гэхдээ үүсгэхээсээ өмнө цонхны баруун дээд талд байгаа .Net FrameWork 3.5 ийн сонголттой байгаа эсэхийг шалгаарай.
Ок товч дарснаар дараах цонх нээгдэнэ.
![]()
Үүнд:
Unit testing project-тай үүсгэх эсэхээ сонгоно. Энэ тусдаа тестийн файл үүсгэх эсэхийг шийдэж байгаа хэрэг.
Хаанаас илүү ихийг мэдэж болох вэ?
Эндээс та хичээл болон видео материалуудтай танилцаж болно. http://www.asp.net/mvc.
Зарим хэрэгтэй блогууд:
Phil Haack – http://www.haacked.com/
Scott Guthrie – http://weblogs.asp.net/scottgu/
Stephen Walther – http://stephenwalther.com/blog/default.aspx
Scott Hanselman – http://www.hanselman.com/blog/
MVC ашиглаж хийсэн вэб сайтууд:
• http://www.cruvee.com/
• http://www.ideavine.net/
• http://www.theloungenet.com/
• http://www.retaggr.com/
• http://www.visitmix.com/
• http://www.dimecasts.net/
• http://www.39×27.com/home.mvc
• http://www.codeplex.com/
• http://www.richpictures.co.uk/
• https://www.netidme.com/Personal
• http://www.jumpthegun.co.uk/
• http://www.devtacular.com/
Эх сурвалж: за ямарч байнсан тэнэж явсан чинь миний хард дискен дээр байж байна. Хэнийх юм бүү мэд. Хэрэг болж юу магад гээд байгаагаар нь хуулж, наав.
Эзэн нь уншвал уурлуузай