C# post请求中参数名称中的句柄点(.)字符

C# post请求中参数名称中的句柄点(.)字符,c#,asp.net,rest,C#,Asp.net,Rest,我正在构建一个restful服务器来处理post请求。但是,其中一个参数名中有一个点(.),我不知道如何处理,因为C#不允许在其变量名中有点(.)。参数名为“data.json”,不带引号 我读了一些关于C#将点(.)转换为下划线(#)的帖子,所以我尝试将变量命名为“data_json”,但它不起作用,字符串是空的 对象类: public class Lead { public string data_json { get; set; } public string page_i

我正在构建一个restful服务器来处理post请求。但是,其中一个参数名中有一个点(.),我不知道如何处理,因为C#不允许在其变量名中有点(.)。参数名为“data.json”,不带引号

我读了一些关于C#将点(.)转换为下划线(#)的帖子,所以我尝试将变量命名为“data_json”,但它不起作用,字符串是空的

对象类:

public class Lead {
    public string data_json { get; set; }
    public string page_id { get; set; }
    public string page_url { get; set; }
}
邮政处理人:

public HttpResponseMessage Post(Lead value) {
    try {
        Log.CreatePostLog(page_id + value.data_json);
    } catch (Exception e) {
        return Request.CreateResponse(HttpStatusCode.BadRequest, e.Message);
    }
    return Request.CreateResponse(HttpStatusCode.OK, "Done!");
}
Post请求正文(无法更改):

当发出请求时,日志会显示页面id,但之后不会显示任何内容。
它应该显示页面id及其后面的Json字符串。

使用NewtonsoftJson PropertyName属性:

public class Lead 
{
     [JsonProperty(PropertyName = "data.json")]
     public string data_json { get; set; }
     public string page_id { get; set; }
     public string page_url { get; set; }
}
添加nuget包:
一种可能的解决方案是,处理名称中包含“.”字符的字段,并将此绑定器应用于模型类

活页夹的代码:

//此活页夹将带点的表单字段分配给带下划线的属性:
//例如data.json->data\u json
公共类dot2emodelbinder:IModelBinder
{
//对于常规字段,我们将使用默认活页夹
私有只读DefaultModelBinder _default=new DefaultModelBinder();
公共对象绑定模型(
ControllerContext ControllerContext,
ModelBindingContext(绑定上下文)
{
//处理正则字段
var model=\u default.BindModel(controllerContext,bindingContext);
//处理特殊领域
如果(型号!=null)
{
var modelType=model.GetType();
var form=controllerContext.HttpContext.Request.form;
foreach(form.AllKeys中的var键)
{
if(key.Contains(“.”)//特殊字段
{
//模型属性必须按约定命名。“->”
var propertyName=key.Replace(“.”,“”);
var propertyInfo=modelType.GetProperty(propertyName);
propertyInfo?.SetValue(模型,表单[键]);
}
}
}
收益模型;
}
}
请注意,这是一个过于简单的实现,它只支持
string
属性,并且其性能不是最佳的。但这是一个工作的起点

现在,您需要将上述绑定器应用于模型类:

[ModelBinder(typeof(dot2parentremodelbinder))]
公共级领导
{
//…属性
}
值得注意的是,控制器必须派生自
System.Web.Mvc
命名空间,而不是
System.Web.Http
中的
ApiController
,因为后者不会触发模型绑定:

使用System.Web.Mvc;
....
公共类MyController:Controller
{
[HttpPost]
公共行动结果岗(潜在价值)
{
//…做点什么
返回base.Content(“完成!”);
}
}
ASP.NET内核 作为旁注,在ASP.NET Core中,通过应用以下属性,可以通过非常简单的方式实现相同的功能:

public class Lead 
{
     [JsonProperty(PropertyName = "data.json")]
     public string data_json { get; set; }
     public string page_id { get; set; }
     public string page_url { get; set; }
}
public-class-Lead
{
[FromForm(Name=“data.json”)]//应用此属性
公共字符串数据_json{get;set;}
//……其他财产
}

您使用的是ASP.NET核心还是经典的ASP.NET?我使用的是经典的ASP.NET 4.7.2,它仍然不起作用。我甚至尝试反序列化字符串,但抛出了一个错误,表示该属性为null@achavesOP显示请求是使用“application/x-www-form-urlencoded”内容类型(“经典HTML表单”)而不是“application/json”发出的,因此Newtonsoft.json不是relevant@german1311不,那没用。我理解它试图做什么,但是请求主体不是json,首先感谢您的详细响应。我完全照你说的做了。在控制器中,我删除了System.Web.Http并添加了System.Web.Mvc。我还添加了[HttpPost]和[HttpGet],但现在,当我执行一个简单的Get时,它会说“没有找到HTTP资源…”我是否遗漏了什么?