不止一种GET方法?

时间:2017-12-04 23:43:49

标签: asp.net asp.net-web-api webforms routing

在ASP.NET webforms项目中,我试图添加一个web api2控制器,通过属性调用一个方法(.NET 4.5。)我必须让路由错误,因为它不起作用。

我在这个例子中工作:

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

这有效:

在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 }
        );
    }

在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);
    }

和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);
      });
}

当我打电话

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

id =&#34; night&#34;,它会返回此错误:
SyntaxError:意外的令牌&lt;在位置0的JSON中 并且代码隐藏永远不会进入GetByName方法。我做错了什么?

更新:在VS2015中调试时,如果我打电话     的getJSON(&#39; API /临床医生/ 1-921&#39;) 它命中ClinicianController中的Get方法并按预期返回临床医师对象。我无法使用GetByName方法,所以我确定我的路由错误。

1 个答案:

答案 0 :(得分:0)

而不是

var transactions = [
    {
        date: "2017-11-17",
        price: "28",
    },
    {
        date: "2017-12-17",
        price: "22",
    },
    {
        date: "2017-12-17",
        price: "20",
    }
]

var sumedUpDates = [];
var prices = [];

function isDateSumedUp(date) {
    return sumedUpDates.indexOf(date.substring(0, 7)) !== -1;
}

function sumUpDate(date) {
    var sum = 0;

    transactions.forEach(t => {
        if(t.date.substring(0, 7) === date.substring(0, 7)) {
            sum += parseInt(t.price);
        }
    });

    sumedUpDates.push(date.substring(0, 7));
    prices.push(sum);
}

transactions.forEach(t => {
    if(!isDateSumedUp(t.date)) {
        sumUpDate(t.date);
    }
});

var obj = {};

sumedUpDates.forEach((d, i) => obj[d] = prices[i]);

console.log(obj);

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

也许您需要在[HttpGet("GetByName/{name}")] 上添加name作为RouteParameter.Optional以及