ASP.NET MVC Controller အား လေ့လာကြည့်ခြင်း
Asp.net MVC Controllers class တွေဟာ တခြား .net class တွေလိုပဲ Properties, Method တွေရှိပါတယ်။ Controllers class တွေအတွက် System.Web.MVC namespace လိုအပ်ပါတယ်။တော်တော်လေးလည်း အသုံးဝင်ပါတယ်။
Rules of Controller Class
Controllers class တွေမှာ လိုက်နာရမယ့် အချက်လေးတွေ ရှိပါတယ်။ အဓိက အနေနဲ့ကတော့ IController Interface ကို Implement လုပ်ပေးရပါမယ်။ Controller Name ရဲ့ အနောက်မှာ Controller ဆိုတဲ့ စာလုံး ပါကိုပါရပါမယ်။ Controller class များသည် Public ဖြစ်ရပါမယ်။ Abstract class မဖြစ်ရပါဘူး။ Generic parameters တွေကိုလက်မခံနိုင်ပါဘူး။ အပေါ်က အချက်တွေနဲ့ မကိုက်ညီရင်တော့ အဲဒီ class ကို Controller မဖြစ် မသတ်မှတ်ပါဘူး။ အဲဒီ class ထဲက method တွေကိုလည်း action မဖြစ်မယူဆပါဘူး။ ပုံမှန်အားဖြင့်တော့ ကျွန်တော့်တို့ Controller အဖြစ် သတ်မှတ်မယ့် Class တွေကို System.Web.MVC.Controller class ကနေ Inheritance လုပ်ယူလို့ရပါတယ်။ System.Web.MVC.Controller class ကိုယ်တိုင် ကလည်း System.Web.MVC.ControllerBase class ကနေ Inheritance လုပ်ထား ပြီးတော့ IController Interface ကို Indirect Implement လုပ်ထားပါတယ်။
Exploring IController Interface
Controller တွေအတွက် အခြေခံအကျဆုံး Interface ဖြစ်ပါတယ်။ IController Interface ကလည်း အရမ်းကို ရိုးရှင်းလွန်းပါတယ်။ Interface ထဲမှာလည်း Execute ဆိုတဲ့ Method တစ်ခုပဲ ရှိပါတယ်။ဒီလိုပုံစံပါ
Public Interface IController
Sub Execute(System.Web.Routing.RequestContext)
End Interface
ကျွန်တော်တို့ IController ကို Implement လုပ်ကြည့်ရအောင်။ ပထမဆုံးအနေနဲ့ Asp.net MVC Empty Web Application ကိုယူလိုက်ပါ။ Solution Explorer မှ Controllers Folder ပေါ်မှာ Right click နှိပ်ပြီး Add ထဲမှ Class ကိုရွေးပါ။ ClassName ကိုပေးတဲ့နေရာမှာ သူ့ Rule အတိုင်း အနောက်မှာ Controller ဆိုတဲ့စာလုံးနဲ့ ဆုံးရပါမယ်။ ဥပမာ BasicController လို့ပေးရပါမယ်။ BasicController Class ထဲမှာ IController Interface ကို Implement လုပ်ရပါမယ်။ အဲဒီအတွက် အောက်က Code လိုရေးပေးရပါမယ်။
Public Class BasicController
အဲဒီတစ်ကြောင်းအောက်မှာ Implements IController လို့ရေးပေးလိုက်ပြီး Enter ခေါက်လိုက်တာနဲ့ IController Interface ထဲက Execute method ကို Implements လုပ်မယ် method သူ့အလိုလိုပေါ်လာမှာပါ။ တကယ်လို့ မပေါ်လာဘူးဆိုရင်လည်း ကိုယ့်ဟာကို ရေးပေးလို့ရပါတယ်။
Public Class BasicController
Implements IController
Public Sub Execute(ByVal requestContext As System.Web.Routing.RequestContext) Implements _
System.Web.Mvc.IController.Execute
requestContext.HttpContext.Response.Write("Hello from BasicController ")
End Sub
End Class
Execute method ထဲမှာ Paramenter ကပါလာတဲ့ RequestContext ကို အသုံးပြုပြီးတော့ Response object နဲ့ String တစ်ကြောင်း ဖြစ်တဲ့ Hello from BasicController ကို ရိုက်ထုတ်မှာပါ။ Application ကို start မလုပ်ခင် အပေါ်က Rules တွေနဲ့ ကိုက်ညီရဲ့လားလို့ စစ်ကြည့်ပါမယ်။ Class Name အနောက်မှာ Controller ဆိုတဲ့စာလုံးပါပါတယ်။ ပြီးတော့ IController Interface ကို Implement လုပ်ထားပါတယ်။ အဲဒါဆိုရင်တော့ BasicController class ကို Controller အဖြစ်ယူဆသွားပါပြီ။ Application ကို Build လုပ်ပြီး Browser နဲ့ http://localhost:(randomport)/basic လို့ ကြည့်လိုက်ရင် Hello from BasicController ဆိုတဲ့စာကြောင်းကိုတွေ့ရမှာပါ။
ControllerBase Class
ControllerBase class က IController Interface ကို Implements လုပ်ထားတဲ့ Abstract class ဖြစ်ပါတယ်။ Controller အတွက်လိုအပ်တဲ့ Features အနည်းငယ်ကိုပေါင်းထည့်ထားတာပါ။ ဥပမာ TempData,ViewData စတာတွေကို ပေါင်းထည့်ထားပါတယ်။ တကယ်တမ်း MVC application တစ်ခု ဖန်တီးတော့မယ်ဆိုရင်တော့ Controller အဖြစ်ယူဆမယ့် Class တွေဟာ Controller class ကနေပဲ Inheritance လုပ်ပြီးအသုံးပြုသင့်ပါတယ်။ ဘာဖြစ်လို့လည်းဆိုတော့ Controller တစ်ခုအတွက် ပြီးပြည့်စုံတယ်လို့ ပြောလို့ရတဲ့ Class တစ်ခုဖြစ်နေလို့ပါ။
Controller Class
Controller class ဟာ ControllerBase ကနေ Inheritance လုပ်ထားတဲ့ Class တစ်ခုဖြစ်ပါတယ်။ တနည်းအားဖြင့်ပြောရရင် IController Interface ကို Indirect အရ Implement လုပ်တယ်လို့ ပြောလို့ရပါတယ်။ အဲဒီအတွက် Controller rule ကနေ သွေဖယ်မသွားသေးပါဘူး။ Controller class ထဲမှာ အရမ်းအသုံူးဝင်တဲ့ Action method ကိုပေါင်းထည့်ထားပါတယ်။ IController Interface ရဲ့ Execute method ထက် ပိုပြီးလွယ်ကူ အဆင်ပြေစေမယ့် နည်းလမ်းပါ။ Action method တွေဟာ အမျိုးမျိုးသော Url တွေကို ကိုင်တွယ်ဖြေရှင်းနိုင်ပြီး။ Parameter တွေကိုပါ လက်ခံနိုင်ပါတယ်။ Return အဖြစ် အမျိုးမျိုးသော Action Result တွေကိုလည်း လုပ်ပေးနိုင်ပါတယ်။ Filter တွေ စစ်ထုတ်ပေးနိုင်ပါတယ်။ အဲဒီအချက်တွေကြောင့် အပေါ်ကပြောခဲ့သလိုပဲ ကျွန်တော်တို့ရဲ့ Controllers တွေကို System.Web.MVC.Controller class ကို အသုံးပြုပြီးတော့ ဖန်တီးသင့်ပါတယ်။ ControllerBase,IController တို့ကို ယူမသုံးသင့်ပါဘူး။
Action Method Selection
Controller မှာရှိတဲ့ Action method ကိုရွေးချယ်ရာမှာ အနည်းငယ်တော့ ရှုပ်ထွေးပါတယ်။ Method တွေကလည်း Overloaded အနေနဲ့ နာမည်တူ ရှိနိုင်ပါတယ်။ Action name နဲ့ Method name ကလည်း မတူပဲ ကွဲပြားနိုင်ပါတယ်။ Method တစ်ခုဖြစ်ရုံနဲ့ Action ဖြစ်ပြီလို့ ပြောလို့မရပါဘူး။ သူ့မှာလည်း Action method ဖြစ်ဖို့ စည်းမျဉ်းတွေ ရှိပါတယ်။ Action Method တစ်ခုဟာ Public ဖြစ်ရပါမယ်။ Static, Shared မဖြစ်ရပါဘူး။ Parent class တွေထဲက Method တွေမဖြစ်ရပါဘူး။ တနည်းအားဖြင့် ပြောရရင်
System.Object,System.Web.MVC.Controller class ထဲက
Method တွေ မဖြစ်ရပါဘူး။ ဥပမာ အနေနဲ့ ToString method လို့ ပေးလို့မရပါဘူး။ ToString method က System.Object ထဲမှာကြေငြာ ထားပြီးသားပါ။ အဲဒီလို Method တွေဟာ Action Method မဖြစ်ပါဘူး။ Special Method လည်း မဖြစ်ရပါဘူး။ ဥပမာ အနေနဲ့ Constructor,Properties,Events အဲဒါတွေ မဖြစ်ရပါဘူး။ NonAction Attribute လည်းမပေးထားရပါဘူး။ ပုံမှန်အားဖြင့်တော့ Action Invoker က Action Name နဲ့ Method Name တူတာကို ရွေးချယ်ပါတယ်။ ဒါပေမယ့်လည်း Attribute တခုလောက် ထည့်လိုက်ရုံနဲ့ Action name နဲ့ Method name ဟာ ကွဲပြားသွားနိုင်ပါတယ်။ ဥပမာ
<ActionName("Author")>
Function GetAuthor() As ActionResult
Return View()
End Function
အပေါ်က Code မှာ Method Name က GetAuthor ပါ။ ဒါပေမယ့် အဲဒီ Method အပေါ်မှာ ActionName ဆိုတဲ့ attribute တစ်ခုပါပါတယ်။ Author လို့နာမည် ပေးထားပါတယ်။ ဒီလိုရေးထားတယ်ဆိုရင် Method Name နဲ့ Action Name ဟာ မတူတော့ပါဘူး။ Action Invoker က Author ကို Action method အဖြစ် ယူဆသွားပါတယ်။ Action နဲ့ ပတ်သက်ပြီးတခြား စိတ်ဝင်စားဖို့ကောင်းတဲ့ Attribute တွေ ရှိပါသေးတယ်။ တကယ်လို့ Method တစ်ခုကို Action Method အဖြစ် မသတ်မှတ်ချင်ဘူးဆိုရင် NonAction attribute ကို အသုံးပြုလိုက် ရုံပါပဲ။ ဥပမာ အနေနဲ့
<NonAction()>
Function Getprice() As Double
Return 3.4
End Function
အဲဒီ Getprice ဆိုတဲ့ Method ကို Action အဖြစ်ထည့်စဉ်းစားတော့မှာ မဟုတ်ပါဘူး။ နောက်ထပ် ပိုစိတ်ဝင်စားဖို့ကောင်းတဲ့ Attribute က AcceptVerbs ဆိုတဲ့ Attribute ပါ။ Http ရဲ့ Verbs တွေပေါ်မူတည်ပြီးတော့ အလုပ်လုပ်တာပါ။ ဆိုလိုတာက Action name တူပြီးတော့ Http Verbs တွေမတူညီတဲ့ Version တွေရေးလို့ရပါတယ်။ AcceptVerbs မှာ Parameter တစ်ခုပါပြီး HttpVerbs အမျိုးအစားတွေပါ။ Asp.net MVC 2 မှာတော့ HttpDelete,HttpGet,HttpPost,HttpPut ဆိုပြီးတော့ attribute တွေ တန်းရေးလို့ရပါပြီ။ ဥပမာ အနေနဲ့
<HttpGet()>
Function BlogPost() As ActionResult
Return View()
End Function
<HttpPost()>
Function BlogPost(ByVal id As Integer) As ActionResult
Return View()
End Function
Non-Existent Action method
Controller ထဲမှာ မရှိတဲ့ Action method တစ်ခုကို request လုပ်မိရင် Error တက်လာမှာပါ။ အဲဒီလို Non-Existent Action တွေကို ကိုယ်စိတ်ကြိုက် ကိုင်တွယ်လို့ရပါတယ်။ ဥပမာ HomeController ထဲက မရှိတဲ့ Action ကို မှားခေါ်မိတယ်ဆိုရင် အောက်က Code ကို HomeController ထဲမှာ သွားရေးထားရမှာပါ။
Protected Overrides Sub HandleUnknownAction(ByVal actionName As String)
Response.Write("Non-existent action method call " + Server.HtmlEncode(actionName))
End Sub
Facebook comments:


