Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CamelCasePropertyNamesContractResolver在MapHttpRoute之后不工作_C#_Asp.net Web Api - Fatal编程技术网

C# CamelCasePropertyNamesContractResolver在MapHttpRoute之后不工作

C# CamelCasePropertyNamesContractResolver在MapHttpRoute之后不工作,c#,asp.net-web-api,C#,Asp.net Web Api,我正试图在我的.NETAPI项目中实现JSON骆驼式外壳。在我的入门课程中,我添加了以下几行: config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false; 据我所知,这是在所

我正试图在我的.NETAPI项目中实现JSON骆驼式外壳。在我的入门课程中,我添加了以下几行:

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = 
    new CamelCasePropertyNamesContractResolver();
config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false;
据我所知,这是在所有路线上实施驼峰套管所需的。但是,当我添加以下内容时,这无法工作,响应返回为Pascal Case:

RouteTable.Routes.MapHttpRoute(
    "DefaultApi",
     "{controller}/{id}",
      new {id = RouteParameter.Optional}
);
当我删除上面的MapHttpRoute行并在控制器中使用路由属性时,camel套管工作正常


有人知道这里发生了什么吗?

在回答之前,您应该首先了解覆盖的驼峰案例API响应不会影响模型验证(我们将在回答结束时解决此问题)

对于您的问题:

您必须使用相同的HttpConfiguration变量,因此请尝试使用此变量

// config is an HttpConfiguration object

config.Routes.MapHttpRoute(
     name: "API Default",
     routeTemplate: "api/{controller}/{id}",
     defaults: new { id = RouteParameter.Optional });

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
对于模型验证:

您必须创建一个所有其他控制器都应从中继承的基本控制器,然后通过创建一个新方法来替代ModelStateDictionary(ModelState是只读属性),如下所示(1):


1-我已经检查了许多与解决modelState中的camelCase问题相关的答案,即使是在.net core中,但non提供了一个默认配置解决方案。正如他们提到的,modelState不会受到我答案第一部分中使用的默认配置的影响

问题在于,您需要调用!ModelState.IsValid,因此,不再使用[ApiController]进行自动处理。有一种更好的方法使用拦截器,我将尽快更新答案,以检查其他解决方案
public class BaseApiController : ApiController
{
    public ModelStateDictionary ModelStateAsCamelCase()
    {
        var newModelStateDictionary = new ModelStateDictionary();

        foreach (var element in ModelState)
        {
            if (!string.IsNullOrWhiteSpace(element.Key))
            {
                var keys = element.Key.Split('.');
                List<string> camelKeys = new List<string>();
                foreach (var key in keys)
                {
                    camelKeys.Add(key.First().ToString().ToLowerInvariant() + key.Substring(1));
                }

                // You can (add a / change this) code if the returned key is not
                // composed from the ObjectName.Property, such as when it is 
                // composed from the property name

                var newKey = camelKeys.Aggregate((i, j) => i + "." + j);

                newModelStateDictionary.Add(newKey, element.Value);
            }
            else
                newModelStateDictionary.Add(element);
        }
        return newModelStateDictionary;
    }
}
......

if (!ModelState.IsValid)
    return BadRequest(ModelStateAsCamelCase());

......