是否可以在变量名.net Web API中使用短划线字符?

时间:2015-11-01 16:45:56

标签: c# .net web-services

获取请求来自SMS API传递报告,以获取有关SMS的信息。

将发布到我的api的变量之一是:?err-code = 0。是否可以在.Net Web API解决方案中执行此操作,还是应该使用其他语言?

Web API获取方法:

    public HttpResponseMessage Get([FromUri]TestModel testingDetials)
    {           

        return Request.CreateResponse(System.Net.HttpStatusCode.OK);
    }

模型

  public class TestModel
  {
      public string foo { get; set; }

      public string err_code { get;set; }
  }

我尝试了在这个网站上找到的各种解决方案,它们都不像将[JsonProperty]和[DataMember]添加到err_code属性那样。

2 个答案:

答案 0 :(得分:1)

如果以JSON格式收到请求,您可以使用[JsonProperty(PropertyName = "err-code")]。这是因为JsonProperty是Newtonsoft JSON序列化程序库的一部分,这是Web API用于反序列化JSON的。如果请求不是JSON,则不在管道中使用该库。

正如您所提到的,您可以使用HttpContext。如果我没记错的话,MVC中的模型绑定会将' - '转换为'_',但我可能错了。无论继续使用强类型模型,我建议使用模型绑定。这基本上是在http上下文和模型之间编写自定义映射。您甚至可以扩展通常的方法,并通过编写基于约定的方法将类似“错误代码”的内容映射到名为ErrCode的属性。这是一个例子,滚动一下:http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api 快乐的编码! (通过我会提供一个完整的答案......为了......有一个完整的答案)

答案 1 :(得分:1)

对于我的情况,我创建了一个模型绑定器,将var“_”转换为“ - ”并使用反射设置值。这个答案仅供参考。 以下是代码:(此解决方案用于Web API而非MVC)

public class SmsReceiptModelBinder : IModelBinder
{

    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        if (bindingContext.ModelType != typeof(SmsReceiptModel))
        {
            return false;
        }


        Type t = typeof(SmsReceiptModel);

        var smsDetails = new SmsReceiptModel();
        foreach (var prop in t.GetProperties())
        {
            string propName = prop.Name.Replace('_', '-');
            var currVal = bindingContext.ValueProvider.GetValue(
                     propName);
            if (currVal != null)
                prop.SetValue(smsDetails, Convert.ChangeType(currVal.RawValue, prop.PropertyType), null);
        }

        bindingContext.Model = smsDetails;
        return true;

    }

}