2017-10-16 26 views
-1
方式

我問過類似的問題here前一陣,但並沒有真正句話非常好或解釋什麼正確我正在努力實現。我再試一次,並試圖解釋它好一點!最簡潔的處理動作的路由,同時保持默認路由GET和ASP.NET核心POST行爲2.0 MVC

我有無數個控制器是這一切(現在)有一些變化的ASP.NET 2.0的核心網絡API項目:

[Route("api/[controller]")] 
public class ExampleController : Controller 
{ 
    [HttpGet] 
    public MyType Get() => GetMyTypeFromSomewhere(); 

    [HttpPost] 
    public void Post([FromBody]updated) => UpdateMyType(updated); 

    [HttpGet("[action]")] 
    public void SelectedOption() => Options.GetSelectedOption(); 

    [HttpPost("[action]")] 
    public void SelectOption([FromBody]int id) => Options.SelectOption(id); 

    [HttpDelete("[action]")] 
    public void DeleteOption([FromBody]Guid id) => Options.DeleteOption(id); 
} 

你大概可以從連這個簡單的例子看,這是很煩人有包括[Route("api/[controller]")]每個控制器的頂部,更是讓有包含在HTTP動詞("[action]")每個非默認操作的屬性。

我希望能夠有默認路由Get()Post()的請求沒有指定動作,但仍然規定時,其他動作路線 - 並能夠實現這一目標,而不必每一個控制器和方法來標記與該死的東西。

例如:

  • GET mysite.com/api/Example
    應返回的MyType的實例
  • POST mysite.com/api/Example
    應該採取一個實例MyType
  • GET mysite.com/api/Example/SelectedOption
    應該返回一個int
  • POST mysite.com/api/Example/SelectOption
    應該採取一個int
  • DELETE mysite.com/api/Example/DeleteOption
    應該採取一個int

我已經試過圖路線和不同類型的控制器和方法裝飾的多種不同的組合,但無法找到任何替代標記與("[action]")絕對一切。

使用app.addMvcMapRoute如果我指定{action}不會因爲工作,我不能達到get()和郵政()無需添加/獲取/後我的請求結束(有與{action?}沒有區別)。
我已經得到的最接近爲{action=Get},哪些路由度日默認的方法,但休息到達默認POST方法的能力。

這甚至可能,如果是這樣,沒有人知道如何?

+0

,我不認爲這是可能的開箱,但我敢肯定,你可以使用自己的路由系統實現它。 [這](https://weblogs.asp.net/imranbaloch/custom-routing-aspnet5-mvc6)似乎是一個體面的開始。 – Jonesopolis

+0

另外,你應該使用PUT來實現更新值的冪等方法。 POST用於添加值。 –

回答

-1

我覺得這只是消除在航線行動的問題。具體如下:

routes.MapRoute("default", "api/{controller=Values}/{id?}");

希望它能幫助!

-1

不會屬性路由是一個更好的方法?

E.g.在類級聲明[Route(「api/example」)],然後你的動作可以是你的動詞,使用相關的屬性,例如[HttpGet]等。

-1

我總是將Route屬性添加到類中。從那裏我用底部的默認路線(順序很重要)命令我的路線。 我也會使用約束來幫助請求珊瑚正確的行動。 我發現你的非默認Get和Post方法有點奇怪。您目前如何設置它們,您將100%必須在非默認獲取操作的屬性中指定操作。

難道你不只是從post方法返回選項? 我通常喜歡避免使用動作名稱(如果可能),因爲我覺得它使api更易於使用。

無論如何,抱歉,如果我誤解了你想要完成的事情。

下面是編號怎麼寫你的控制器:

[Route("api/[controller]")] 
public class ExampleController : Controller 
{ 
    [HttpGet] 
    public MyType Get() => GetMyTypeFromSomewhere(); 

    [HttpPost("{id:int}") 
    public IActionResult SelectOption(int id) 
    { 
     Options.SelectOption(id); 
     var option = Options.GetSelectedOption(); 
     return Ok(option); 
    } 

    [HttpGet("[action]")] 
    public IActionResult SelectedOption() 
    { 
     var option = Options.GetSelectedOption(); 
     return Ok(option); 
    } 

    [HttpPost] 
    public void Post([FromBody]updated) => UpdateMyType(updated); 

    [HttpDelete("{id:guid}") 
    public void DeleteOption(Guid id) => Options.DeleteOption(id); 
} 
+0

下來投票者關心評論爲什麼他們投票了?不要放棄對原因的解釋。 – WBuck

+0

OP希望在其控制器上不使用屬性('RouteAttribute','HttpGet','HttpPost')來實現路由約定。你提供了一個仍然使用屬性的答案。 –

+0

@AlexWiese我給了他一個可能的選擇,在每個動作上使用[動作](這是他要求的其他東西)。 – WBuck

相關問題