2016-04-16 15 views
2

Ich baue Restful Stil API in VS2015, C#, ASP.NET5 MVC6-Stack und ich kam zu kleinen Schwierigkeiten, wenn es um das Routing geht. Im adnotations direkt in Controller:ASP.NET5 MVC 6 Routing mit optionalen Parameter/Default-Parameter Wert

[HttpGet("machine/{machineId}-{cnt:int}")] 
public IActionResult GetReportsByMachineId(string machineId, int cnt) 
{ 
    var item = _reportRepository.GetReportsByMachineId(machineId, 0, cnt); 
    if ((item == null) || (!item.Any())) 
    { 
     return HttpNotFound(); 
    } 
    return new ObjectResult(item); 
} 

und es funktioniert, wenn ich api/report/machine/[machineName]-5 nennen - i erhalten 5 Dokumente aus der Datenbank.

Aber ich würde cnt Parameter optional mit Standardwert machen - so würde der Anruf für api/report/machine/[machineName] gültig sein.

Basierend auf http://stephenwalther.com/archive/2015/02/07/asp-net-5-deep-dive-routing Ich habe bisher versucht:

[HttpGet("machine/{machineId}-{cnt:int=10}")] - Controller nicht fangen api/machine/{machineName} (i Begrüßungsseite Code erhalten)

[HttpGet("machine/{machineId}-{cnt?}")] - App wird nicht starten (i auch nicht bekommen MVC Begrüßungsseite)

[HttpGet("machine/{machineId}-{cnt:int?}")] - App wird nicht starten (wie oben)

Irgendwelche Ideen?

-Code für die gesamte Steuerung (ich habe keine anderen Routen angegeben): http://pastebin.pl/view/11050284

Antwort

3

Optional URI Parameters and Default Values

Sie können eine URI-Parameter durch Hinzufügen eines Fragezeichens auf die Route Parameter optional machen. Wenn ein Routenparameter optional ist, müssen Sie einen Standardwert für den Methodenparameter definieren.

[HttpGet("machine/{machineId}/{cnt:int?}")] 
public IActionResult GetReportsByMachineId(string machineId, int cnt = 10) {...} 

In diesem Beispiel api/report/machine/nazwa_maszyny/10 und api/report/machine/nazwa_maszyny die gleiche Ressource zurück.

Alternativ können Sie einen Standardwert innerhalb der Route Vorlage angeben, wie folgt:

[HttpGet("machine/{machineId}/{cnt:int=10}")] 
public IActionResult GetReportsByMachineId(string machineId, int cnt) {...} 

Dies ist fast das gleiche wie im vorherigen Beispiel, aber es gibt einen kleinen Unterschied von Verhalten, wenn der Standardwert angewendet.

  • Im ersten Beispiel („{cnt: int}“), wird der Standardwert von 10 direkt mit dem Methodenparameter zugeordnet, so dass die Parameter dieses genauen Wert haben wird.

  • Im zweiten Beispiel ("{cnt: int = 10}") durchläuft der Standardwert von "10" den Modellbindungsvorgang. Der Standardmodellbinder konvertiert "10" in den numerischen Wert 10. Sie können jedoch ein benutzerdefiniertes Modellbindermodul anschließen, das möglicherweise etwas anderes bewirkt.

+0

danken Ihnen. Also war das Problem mit dem Trennzeichen? Ich benutzte "-" und solange die Parameter verpflichtend waren funktionierte es. – lukpep

+0

das ist richtig. Die Frame-Arbeit weiß, dass das '/' entfernt wird, aber das '-' wird nicht automatisch entfernt. Sie hätten den Computernamen mit dem Bindestrich verwenden müssen, was nicht optional ist – Nkosi

0

Ich habe dies fast arbeiten, die Urls arbeiten, wenn ich die CompanyID passieren, aber wenn ich es leer wird standardmäßig 00000-00000-00000etc verlassen. Das Problem ist, dass ich die Standard-Guid basierend auf einer Funktion nicht angeben kann.

Fehler

public async Task<IActionResult> Edit(Guid CompanyId = GetCurrentUserAsync().Result.CompanyId, Guid? id) 

Dies ist ungültig, weil der Standard eine Kompilierung konstant sein muss.

Gibt es eine Möglichkeit GetCurrentUserAsync(). Result.CompanyId als Standard zu verwenden, ohne in jeder Funktion geprüft wird, ob (CompanyID == Guid.Empty) GetCurrentUserAsync(). Result.CompanyId

Startup.cs

routes.MapRoute(name: "areaRoute", template: "{area:exists}/{CompanyId?}/{controller}/{action=Index}/{id?}"); 

-Controller

public async Task<IActionResult> Edit(Guid CompanyId, Guid? id) 
{ 
    if (id == null) 
    { 
     return NotFound(); 
    } 
    var companyCredential = await _context.CompanyCredential.Where(p => p.CompanyId == CompanyId).SingleOrDefaultAsync(m => m.Id == id); 
    if (companyCredential == null) 
    { 
     return NotFound(); 
    } 
    ViewData["CompanyId"] = new SelectList(_context.Company, "Id", "Id", companyCredential.CompanyId); 
    return View(companyCredential); 
}