יצירת Controller עם מתודות המכילות Actoin Name משותף
(פוסט זה נכתב בעזרת חיים בריקמן - אחד האנשים המוכשרים ביותר שאני מכיר)
נניח שאתם רוצים לכתוב Controller עבור Orders המכיל מתודות לשליפה ועדכון נתונים, והדרישה היא שהפנייה תהיה עם אותו Action Name וה - Controller יזהה את המתודה המתאימה לפי סוג הפנייה (GET, POST, PUT, DELETE)
נקח לדוגמא את הקוד הבא:
// SELECT
[HttpGet]
public ActionResult Index(int id)
{
return Content("GET /Orders/{id} | Orders[id]");
}
// INSERT
[HttpPost]
public ActionResult Index(OrderDTO order)
{
return Content("POST /Orders | Insert new Order [" + order.Name + " ] to Orders collection");
}
// UPDATE
[HttpPut]
public ActionResult Index(OrderDTO order)
{
return Content("PUT /Orders | Updates new Order [" + order.Id + " ] in Orders collection");
}
// DELETE
[HttpDelete]
public ActionResult Index(int id)
{
return Content("DELETE /Orders | delete [id] from Orders collection");
}
הרצון לעשות זאת הוא כדי שמצד הלקוח לא יצטרכו לפנות למתודות שונות אלא רק לשנות את סוג הקריאה. וכמובן לכתוב Controller שתומך בתקן REST
ברור שקוד זה לא יתקמפל, הדרך הפשוטה לתקן זאת היא לשנות את שמות המתודות ולהוסיף את הקוד הבא מעל כל מתודה
כעת מצד הלקוח ניתן יהיה לפנות לשירותים בצורה הבאה:
$.ajax({url: '/Orders/3', type: 'PUT', data: {Id:2,Name:'asd'}});
$.ajax({url: '/Orders/2', type: 'POST', data: "{Id:2,Name:'asd'}"});
$.ajax({url: '/Orders/2', type: 'DELETE'});
וכדי לקבל מידע ניתן פשוט לגלוש בדפדפן (ששולח GET).