【问题标题】:How to overload WebApi method如何覆盖 Web Api 方法
【发布时间】:2016-08-28 16:08:45
【问题描述】:

我是 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 架构有关。 现在我的问题是我该如何处理这种情况。我可以在 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

我的问题很简单

假设我的 webApi 中有 4 个 GET 方法,那么我该如何处理 webApi,以便我可以实现所有 4 GET 方法

【问题讨论】:

  • @CodeCaster 我的问题是如何在 MapHttpRoute 方法中为我的模型和字符串添加约束。可以为int和string添加约束,但是如何为模型添加约束,请帮助我理解。
  • 我不确定你的意思。您的意思是您希望根据发布的属性名称进行路由吗?然后你需要属性路由,就像在副本中解释的那样。
  • @CodeCaster 我有两个 post 方法,现在一个接受字符串作为参数,另一个接受我的模型作为参数,我该如何处理这种情况,谢谢
  • cannot trivially do that,只需使用属性路由(/YourController/AddPerson/YourController/GetCity)。无论如何,后者应该是 GET。

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


【解决方案1】:

进行属性路由。在您的 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 以及您的 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' 并在参数中或作为查询字符串或 api/getRelevantCity/123 传递 stateId,其中 123 是状态 id

【讨论】:

    【解决方案2】:

    your case吗? 我完全同意关于 GET 和 POST 方法的回答,但您可以使用 OdataController。它看起来像普通的休息调用,但它可以调用方法(您定义的),例如 api/Object(123)/GetRelevantCity 或 api/Object(123)/getRelevantCity (但不是 api/Object/123 )

    您还可以根据请求正文创建自定义约束 (an example of the constraint): 抱歉以这种方式读取帖子数据...

    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 requestMessagethere 是多次推送的完整示例(这段代码可能不太干净,应该重构,但我希望这个想法很清楚)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多