一開始我們先創一個空白的ExampleController的空白控制器,作為等等的示範
由於我們這張只談controller,所以先把回傳View改成回傳字串就好
namespace Kcg.Controllers
{
public class ExampleController : Controller
{
public string Index()
{
return "Index";
}
}
}
controller是整個MVC中主要入口的第一關,那到這邊應該已經很熟悉,要怎麼進入這個Controller
就是在網址打上/Example,就會看到畫面回傳Index,那這邊因為等等要示範又沒使用上view,所以我用postman來做讀取
其實到這邊,基本個controller其實已經會了,所以我們接著來講一些也是基本的屬性標籤
屬性標籤是什麼?其實之前已經看過了[HttpPost]跟[ActionName]都是,而用法就是蓋在該方法上即可
是一種在.net core裡面方便直覺,又好用的寫法
public string Delete()
{
return "Delete";
}
[HttpPost]
public string DeletePost()
{
return "DeletePost";
}
先來看看[HttpPost]的標籤,這主要是我們在網頁中送出表單的資料主流會是用Post方法來送出
所以我們為了要接到使用者傳來的post要求,就會在要接的方法上面蓋上一個[HttpPost]標籤
這樣使用者使用post傳來的要求,就會被這個方法給接到,我們就來試試看
緊接著我們就要來講到[ActionName]標籤,這裡可以看到我們網址是用DeletePost,因為方法名稱不能重複,且網址的基本規則設計就是這樣
那如果我們想要打破這個規則改用成Post /delete也進入這個方法該怎麼做呢?就是用[ActionName]標籤
[HttpPost, ActionName("delete")]
public string DeletePost()
{
return "DeletePost";
}
使用標籤就可以很簡潔又輕鬆的達到我們的目的
那接著我們來談一下路由標籤,什麼是路由標籤?就是決定我們網址的一個標籤
在我們MVC中,之前已經談到很多次,基本的路由規則有設定在Program.cs中
那如果我們要額外增加規則可以修改Program.cs中的路由設定
但其實也可以在Controller中透過路由標籤來修改,我們就來動手試試吧
namespace Kcg.Controllers
{
[Route("example2")] //在class上面蓋上一個路由標籤example2
public class ExampleController : Controller
{
public string Index()
{
return "Index";
}
public string Delete()
{
return "Delete";
}
[HttpPost,ActionName("delete")]
public string DeletePost()
{
return "DeletePost";
}
}
}
此時我們的網址第一層就會變成example2而不是example
而且這個路由標籤會大於Program.cs中的路由設定
也就是說在這邊設了路由標籤,就不在會依照Program.cs中的路由設定了
自己試一下會發現Program.cs中的規則都讀不到資料了甚至出現錯誤,連ActionName也不起作用了
那上面這個錯誤是說有多個同樣的進入點,他不知道該進入哪個方法,為什麼忽然會變成有多個?
是因為我們使用[Route("example2")]後,整個路由規則都改變了
以下這兩個方法會是同一個進入點,那我們要怎麼把它們分開呢?可以利用Http方法標籤+名稱
//example
[HttpGet]
public string Index()
{
return "Index";
}
//example/delete
[HttpGet("delete")]
public string Delete()
{
return "Delete";
}
那這邊的網址規則就會是example2([Route("example2")])
/加上名稱
我們就來讀讀看
[HttpPost("delete")]
public string DeletePost()
{
return "DeletePost";
}
那由於ActionName已經不起作用了,下面的post我們可以改成這樣,那讀取方式如下
最後,有可能你有特殊需求,同一個方法會有多個網址,那該如何設定呢?很簡單,就再往上蓋上去就對了,這樣的多網址設定是ActionName做不到的
所以有多網址指向同一個方法的需求,就要用這種方式去做,當然這在Program.cs中的路由也可以設定,這有機會後面在說
[HttpPost("delete2")]
[HttpPost("delete")]
public string DeletePost()
{
return "DeletePost";
}
這樣delete2跟delete的post方法都會進到這個函式中
所以這邊可以看到,再net core之中,網址是可以很活的去設定跟改變的
那這節就是在講一下基本的Controller的觀念,跟一些基本會再Controller會用到的屬性標籤介紹給大家知道