2017-12-04 3 views
0

In einem ASP.NET-Webformular-Projekt, ich versuche, einen Web-API-Controller eine Methode über Attribute aufrufen (.NET 4.5.) Ich muss das Routing falsch haben, weil es nicht funktioniert.Mehr als eine GET-Methode?

Ich arbeite an diesem Beispiel:

https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

Dies funktioniert:

In dem WebApiConfig.cs:

public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     // this enables attribute routes 
     config.MapHttpAttributeRoutes(); 

     // this uses convention-based routes ("Get" as a default) 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 

In ClinicianController.cs:

Clinician[] clinicians = new Clinician[] 
    { 
     new Clinician { Id = "1-552", Text = "EVERY MD,JOYCE" }, 
     new Clinician { Id = "1-598", Text = "BODY MD,THOMAS" }, 
     new Clinician { Id = "1-642", Text = "WANG MD,STANLEY R" }, 
     new Clinician { Id = "1-893", Text = "CHUNG MD,JANAHN C" }, 
     new Clinician { Id = "1-914", Text = "TO MD,J R" }, 
     new Clinician { Id = "1-921", Text = "NIGHT MD,BARRY J" } 
    }; 
    public IEnumerable<Clinician> GetAllClinicians() 
    { 
     return clinicians; 
    } 

    public IHttpActionResult Get(string id) 
    { 
     var clinician = clinicians.FirstOrDefault((p) => p.Id == id); 
     if (clinician == null) 
     { 
      return NotFound(); 
     } 
     return Ok(clinician); 
    } 

    //NOPE 
    [Route("clinician/{name}/GetByName")] 
    //NOPE 
    [HttpGet] 
    public IHttpActionResult GetByName(string name) 
    { 
     var clinician = clinicians.FirstOrDefault((p) => p.Text == name); 
     if (clinician == null) 
     { 
      return NotFound(); 
     } 
     return Ok(clinician); 
    } 

Und das javascript:

$(document).ready(function() { 
    // Send an AJAX request 
    $.getJSON(uri) 
     .done(function (data) { 
     // On success, 'data' contains a list of products. 
     $.each(data, function (key, item) { 
      // Add a list item for the product. 
      $('<li>', { text: formatItem(item) }).appendTo($('#clinicians')); 
     }); 
     }); 
}); 

function formatItem(item) { 
    return item.Id + ' : ' + item.Text; 
} 

function find() {   
    var id = $('#mgpId').val(); 
    // NOPE var jqxhr = $.getJSON(uri + '/' + id + '/GetByName') 
    var jqxhr = $.getJSON(uri + '/' + id) 
     .done(function (data) { 
      $('#clinician').text(formatItem(data)); 
     }) 
     .fail(function (jqXHR, textStatus, err) { 
      $('#clinician').text('Error: ' + err); 
     }); 
} 

Als ich

$.getJSON(uri + '/' + id + '/GetByName') 

mit id = "Nacht" aufrufen, gibt es diesen Fehler:
Syntaxerror: unerwartetes Token < in JSON an Position 0 und die Codebehind gibt die GetByName-Methode nie ein. Was mache ich falsch?

UPDATE: Wenn in VS2015 Debuggen, wenn ich getJSON ('api/Clinician/1-921') nennen es die Get-Methode in der ClinicianController trifft und gibt dem Kliniker Objekt wie erwartet. Ich kann nicht erreichen, dass es die Methode GetByName trifft, daher bin ich mir sicher, dass das Routing falsch ist.

+1

Es hinzuzufügen, ist wahrscheinlich eine Ausnahme geschieht, und es ist der Rückkehr entweder HTML oder XML statt JSON. Drücke F12 im Browser und beobachte den Netzwerkverkehr. Das sollte dir die Antwort zeigen. –

Antwort

0

Statt

[Route("clinician/{name}/GetByName")] 
[HttpGet] 

versuchen

[HttpGet("GetByName/{name}")] 

Vielleicht brauchen Sie name als RouteParameter.Optional auf config as-gut