如何重载 WebApi 方法
How to overload WebApi method
我是 WebApi 的新手,现在我有两个像这样的 httpPost 方法
[HttpPost]
public List<YellowPages.Person> AddPersonDetails(YellowPages.Person person)
{
Repository.Repository.personsList.Add(person);
return Repository.Repository.personsList;
}
第二种方法是
[HttpPost]
public List<YellowPages.City> getRelevantCity(string stateID)
{
return new Repository.YellowPages.City().getCity()
.Where(x => x.StateID ==stateID).ToList();
}
每当我调用 getRelevantCity 方法时,都会调用 AddPersonDetails 方法,我相信这与 REST 体系结构有关。
现在我的问题是如何处理这个 situation.Is 我可以在 WebApiConfig.cs 文件中做些什么并添加约束?如果是,如何处理我正在使用的模型类型的约束。
谢谢。
更新 1
按照建议,我更改了删除属性的方法,如下所示
public List<YellowPages.Person> AddPersonDetails(YellowPages.Person person)
{
Repository.Repository.personsList.Add(person);
return Repository.Repository.personsList;
}
public List<YellowPages.City> getRelevantCity(string stateID)
{
return new Repository.YellowPages.City().getCity().Where(x => x.StateID == stateID).ToList();
}
我的ajax电话是这样的
$('#StateID').change(function () {
$.ajax({
type: 'POST',
url: '/api/shoppingCart/getRelevantCity',
ContentType: 'application/json',
data: { 'stateID': $('#StateID').val() },
dataType: 'json',
success: function (returnData) {
var grid = '';
$.each(returnData, function (i, d) {
grid = grid + createDom(d);
});
$('#result').empty().append(
grid
);
},
error: function (xhr, ajaxOptions, thrownError) {
alert('error');
}
});
});
$('#btnAjax').click(function (e) {
debugger;
e.preventDefault();
var d = { 'PersonName': $('#PersonName').val(), 'gender': $('#gender').prop('checked', true).val(), 'StreetAddress': $('#StreetAddress').val(), 'StateID': $("#StateID option:selected").text(), 'Pincode': $('#Pincode').val() };
$.ajax({
type: 'POST',
url: '/api/shoppingCart/AddPersonDetails',
ContentType: 'application/json',
data: d,
dataType: 'json',
success: function (returnData) {
var grid = '';
$.each(returnData, function (i, d) {
grid = grid + createDom(d);
});
$('#result').empty().append(
grid
);
},
error: function (xhr, ajaxOptions, thrownError) {
alert('error');
}
});
});
无论我打哪个ajax调用,第一个方法都会被调用,你能帮我看看怎么处理吗?
更新 2
我的问题很简单
Suppose if i have 4 GET methods in my webApi, then how can I handle
the webApi so that i could get all the 4 GET methods implemented
进行属性路由。在您的 api 配置中,添加
config.MapHttpAttributeRoutes();
在你的控制器上:
[RoutePrefix("api")]
public class ShoppingCartController....
对于操作:
[HttpPost]
[Route("getRelevantCity")]
public List<YellowPages.Person> GetRelevantCity
[HttpPost]
[Route("addPersonDetails")]
public List<YellowPages.Person> AddPersonDetails
因此,理想情况下,您的 GetRelevantCity 应该是 GET 方法,而不是 POST。我建议您将其更改为 HttpGet in action 以及您的 javascript 代码:
[HttpGet] //this is not required; as per naming convention this will be a GET request by default
[Route("getRelevantCity/{stateId}")]
public List<YellowPages.Person> GetRelevantCity(int stateId)
并且在 $.ajax 中,更改 type: 'GET'
并在参数中传递 stateId 或作为查询字符串或 api/getRelevantCity/123 其中 123 是状态 ID
是your case吗?
我完全同意有关 GET 和 POST 方法的回答,但您可以使用 OdataController。它看起来像普通的休息调用,但它可以调用方法(您定义的),如 api/Object(123)/GetRelevantCity 或 api/Object(123)/getRelevantCity(但不是 api/Object/ 123)
您还可以根据请求正文创建自定义约束 ():
很抱歉以这种方式读取 post 数据...
public class TypeConstraint: IHttpRouteConstraint
{
public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values,
HttpRouteDirection routeDirection)
{
return IsItCorrect(request.Content.ReadAsStringAsync().Result);
}
}
this way of reading the requestMessage
there 是 multiple pust 的完整示例(这段代码可能不太干净,应该重构,但我希望这个想法很清楚)
我是 WebApi 的新手,现在我有两个像这样的 httpPost 方法
[HttpPost]
public List<YellowPages.Person> AddPersonDetails(YellowPages.Person person)
{
Repository.Repository.personsList.Add(person);
return Repository.Repository.personsList;
}
第二种方法是
[HttpPost]
public List<YellowPages.City> getRelevantCity(string stateID)
{
return new Repository.YellowPages.City().getCity()
.Where(x => x.StateID ==stateID).ToList();
}
每当我调用 getRelevantCity 方法时,都会调用 AddPersonDetails 方法,我相信这与 REST 体系结构有关。 现在我的问题是如何处理这个 situation.Is 我可以在 WebApiConfig.cs 文件中做些什么并添加约束?如果是,如何处理我正在使用的模型类型的约束。 谢谢。
更新 1
按照建议,我更改了删除属性的方法,如下所示
public List<YellowPages.Person> AddPersonDetails(YellowPages.Person person)
{
Repository.Repository.personsList.Add(person);
return Repository.Repository.personsList;
}
public List<YellowPages.City> getRelevantCity(string stateID)
{
return new Repository.YellowPages.City().getCity().Where(x => x.StateID == stateID).ToList();
}
我的ajax电话是这样的
$('#StateID').change(function () {
$.ajax({
type: 'POST',
url: '/api/shoppingCart/getRelevantCity',
ContentType: 'application/json',
data: { 'stateID': $('#StateID').val() },
dataType: 'json',
success: function (returnData) {
var grid = '';
$.each(returnData, function (i, d) {
grid = grid + createDom(d);
});
$('#result').empty().append(
grid
);
},
error: function (xhr, ajaxOptions, thrownError) {
alert('error');
}
});
});
$('#btnAjax').click(function (e) {
debugger;
e.preventDefault();
var d = { 'PersonName': $('#PersonName').val(), 'gender': $('#gender').prop('checked', true).val(), 'StreetAddress': $('#StreetAddress').val(), 'StateID': $("#StateID option:selected").text(), 'Pincode': $('#Pincode').val() };
$.ajax({
type: 'POST',
url: '/api/shoppingCart/AddPersonDetails',
ContentType: 'application/json',
data: d,
dataType: 'json',
success: function (returnData) {
var grid = '';
$.each(returnData, function (i, d) {
grid = grid + createDom(d);
});
$('#result').empty().append(
grid
);
},
error: function (xhr, ajaxOptions, thrownError) {
alert('error');
}
});
});
无论我打哪个ajax调用,第一个方法都会被调用,你能帮我看看怎么处理吗?
更新 2
我的问题很简单
Suppose if i have 4 GET methods in my webApi, then how can I handle the webApi so that i could get all the 4 GET methods implemented
进行属性路由。在您的 api 配置中,添加
config.MapHttpAttributeRoutes();
在你的控制器上:
[RoutePrefix("api")]
public class ShoppingCartController....
对于操作:
[HttpPost]
[Route("getRelevantCity")]
public List<YellowPages.Person> GetRelevantCity
[HttpPost]
[Route("addPersonDetails")]
public List<YellowPages.Person> AddPersonDetails
因此,理想情况下,您的 GetRelevantCity 应该是 GET 方法,而不是 POST。我建议您将其更改为 HttpGet in action 以及您的 javascript 代码:
[HttpGet] //this is not required; as per naming convention this will be a GET request by default
[Route("getRelevantCity/{stateId}")]
public List<YellowPages.Person> GetRelevantCity(int stateId)
并且在 $.ajax 中,更改 type: 'GET'
并在参数中传递 stateId 或作为查询字符串或 api/getRelevantCity/123 其中 123 是状态 ID
是your case吗? 我完全同意有关 GET 和 POST 方法的回答,但您可以使用 OdataController。它看起来像普通的休息调用,但它可以调用方法(您定义的),如 api/Object(123)/GetRelevantCity 或 api/Object(123)/getRelevantCity(但不是 api/Object/ 123)
您还可以根据请求正文创建自定义约束 (
public class TypeConstraint: IHttpRouteConstraint
{
public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values,
HttpRouteDirection routeDirection)
{
return IsItCorrect(request.Content.ReadAsStringAsync().Result);
}
}
this way of reading the requestMessage there 是 multiple pust 的完整示例(这段代码可能不太干净,应该重构,但我希望这个想法很清楚)