Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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
JSON属性未绑定到ASP.NET MVC 5 Post请求中的JSON.NET PropertyName_Json_Asp.net Mvc_Asp.net Mvc 5_Json.net - Fatal编程技术网

JSON属性未绑定到ASP.NET MVC 5 Post请求中的JSON.NET PropertyName

JSON属性未绑定到ASP.NET MVC 5 Post请求中的JSON.NET PropertyName,json,asp.net-mvc,asp.net-mvc-5,json.net,Json,Asp.net Mvc,Asp.net Mvc 5,Json.net,我正在绞尽脑汁想为什么我的属性ReCaptchaResponseJSONProperty不会绑定到我的模型。其他人只是找到了,我的JSON值提供程序类就可以找到了。有什么线索吗?它总是空的 Ajax请求 {"Name":"Joe","Email":"","Message":"","g-recaptcha-response":"data"} ContactUsController.cs [HttpPost] public virtual ActionResult Index(C

我正在绞尽脑汁想为什么我的属性
ReCaptchaResponse
JSONProperty不会绑定到我的模型。其他人只是找到了,我的JSON值提供程序类就可以找到了。有什么线索吗?它总是空的

Ajax请求

{"Name":"Joe","Email":"","Message":"","g-recaptcha-response":"data"}
ContactUsController.cs

 [HttpPost]
        public virtual ActionResult Index(ContactUsModel model)
        {
            _contactUsService.ContactUs(model);

            return Json(new SuccessResponse("Submitted Successfully"));
        }
[JsonObject, DataContract]
    public class ContactUsModel
    {
        public string Name { get; set; }
        public string Email { get; set; }
        public string Message { get; set; }

        [JsonProperty(PropertyName = "g-recaptcha-response"), DataMember(Name = "g-recaptcha-response")]
        public string ReCaptchaResponse { get; set; }
    }
namespace Tournaments.Models.Mvc
{
    public class JsonNetValueProviderFactory : ValueProviderFactory
    {
        public override IValueProvider GetValueProvider(ControllerContext controllerContext)
        {
            // first make sure we have a valid context
            if (controllerContext == null)
                throw new ArgumentNullException("controllerContext");

            // now make sure we are dealing with a json request
            if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
                return null;

            // get a generic stream reader (get reader for the http stream)
            var streamReader = new StreamReader(controllerContext.HttpContext.Request.InputStream);
            // convert stream reader to a JSON Text Reader
            var jsonReader = new JsonTextReader(streamReader);
            // tell JSON to read
            if (!jsonReader.Read())
                return null;

            // make a new Json serializer
            var jsonSerializer = new JsonSerializer();
            jsonSerializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            // add the dyamic object converter to our serializer
            jsonSerializer.Converters.Add(new ExpandoObjectConverter());

            // use JSON.NET to deserialize object to a dynamic (expando) object
            Object jsonObject;
            // if we start with a "[", treat this as an array
            if (jsonReader.TokenType == JsonToken.StartArray)
                jsonObject = jsonSerializer.Deserialize<List<ExpandoObject>>(jsonReader);
            else
                jsonObject = jsonSerializer.Deserialize<ExpandoObject>(jsonReader);

            // create a backing store to hold all properties for this deserialization
            var backingStore = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
            // add all properties to this backing store
            AddToBackingStore(backingStore, String.Empty, jsonObject);
            // return the object in a dictionary value provider so the MVC understands it
            return new DictionaryValueProvider<object>(backingStore, CultureInfo.CurrentCulture);
        }

        private static void AddToBackingStore(Dictionary<string, object> backingStore, string prefix, object value)
        {
            var d = value as IDictionary<string, object>;
            if (d != null)
            {
                foreach (KeyValuePair<string, object> entry in d)
                {
                    AddToBackingStore(backingStore, MakePropertyKey(prefix, entry.Key), entry.Value);
                }
                return;
            }

            var l = value as IList;
            if (l != null)
            {
                for (int i = 0; i < l.Count; i++)
                {
                    AddToBackingStore(backingStore, MakeArrayKey(prefix, i), l[i]);
                }
                return;
            }

            // primitive
            backingStore[prefix] = value;
        }

        private static string MakeArrayKey(string prefix, int index)
        {
            return prefix + "[" + index.ToString(CultureInfo.InvariantCulture) + "]";
        }

        private static string MakePropertyKey(string prefix, string propertyName)
        {
            return (String.IsNullOrEmpty(prefix)) ? propertyName : prefix + "." + propertyName;
        }
    }
}
[HttpPost]
public virtual ActionResult Index([ModelBinder(typeof(JsonNetModelBinder))]ContactUsModel model)
{
    _contactUsService.ContactUs(model);

    return Json(new SuccessResponse("Submitted Successfully"));
}
ContactUsMode.cs

 [HttpPost]
        public virtual ActionResult Index(ContactUsModel model)
        {
            _contactUsService.ContactUs(model);

            return Json(new SuccessResponse("Submitted Successfully"));
        }
[JsonObject, DataContract]
    public class ContactUsModel
    {
        public string Name { get; set; }
        public string Email { get; set; }
        public string Message { get; set; }

        [JsonProperty(PropertyName = "g-recaptcha-response"), DataMember(Name = "g-recaptcha-response")]
        public string ReCaptchaResponse { get; set; }
    }
namespace Tournaments.Models.Mvc
{
    public class JsonNetValueProviderFactory : ValueProviderFactory
    {
        public override IValueProvider GetValueProvider(ControllerContext controllerContext)
        {
            // first make sure we have a valid context
            if (controllerContext == null)
                throw new ArgumentNullException("controllerContext");

            // now make sure we are dealing with a json request
            if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
                return null;

            // get a generic stream reader (get reader for the http stream)
            var streamReader = new StreamReader(controllerContext.HttpContext.Request.InputStream);
            // convert stream reader to a JSON Text Reader
            var jsonReader = new JsonTextReader(streamReader);
            // tell JSON to read
            if (!jsonReader.Read())
                return null;

            // make a new Json serializer
            var jsonSerializer = new JsonSerializer();
            jsonSerializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            // add the dyamic object converter to our serializer
            jsonSerializer.Converters.Add(new ExpandoObjectConverter());

            // use JSON.NET to deserialize object to a dynamic (expando) object
            Object jsonObject;
            // if we start with a "[", treat this as an array
            if (jsonReader.TokenType == JsonToken.StartArray)
                jsonObject = jsonSerializer.Deserialize<List<ExpandoObject>>(jsonReader);
            else
                jsonObject = jsonSerializer.Deserialize<ExpandoObject>(jsonReader);

            // create a backing store to hold all properties for this deserialization
            var backingStore = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
            // add all properties to this backing store
            AddToBackingStore(backingStore, String.Empty, jsonObject);
            // return the object in a dictionary value provider so the MVC understands it
            return new DictionaryValueProvider<object>(backingStore, CultureInfo.CurrentCulture);
        }

        private static void AddToBackingStore(Dictionary<string, object> backingStore, string prefix, object value)
        {
            var d = value as IDictionary<string, object>;
            if (d != null)
            {
                foreach (KeyValuePair<string, object> entry in d)
                {
                    AddToBackingStore(backingStore, MakePropertyKey(prefix, entry.Key), entry.Value);
                }
                return;
            }

            var l = value as IList;
            if (l != null)
            {
                for (int i = 0; i < l.Count; i++)
                {
                    AddToBackingStore(backingStore, MakeArrayKey(prefix, i), l[i]);
                }
                return;
            }

            // primitive
            backingStore[prefix] = value;
        }

        private static string MakeArrayKey(string prefix, int index)
        {
            return prefix + "[" + index.ToString(CultureInfo.InvariantCulture) + "]";
        }

        private static string MakePropertyKey(string prefix, string propertyName)
        {
            return (String.IsNullOrEmpty(prefix)) ? propertyName : prefix + "." + propertyName;
        }
    }
}
[HttpPost]
public virtual ActionResult Index([ModelBinder(typeof(JsonNetModelBinder))]ContactUsModel model)
{
    _contactUsService.ContactUs(model);

    return Json(new SuccessResponse("Submitted Successfully"));
}
JsonNetValueProviderFactory.cs

 [HttpPost]
        public virtual ActionResult Index(ContactUsModel model)
        {
            _contactUsService.ContactUs(model);

            return Json(new SuccessResponse("Submitted Successfully"));
        }
[JsonObject, DataContract]
    public class ContactUsModel
    {
        public string Name { get; set; }
        public string Email { get; set; }
        public string Message { get; set; }

        [JsonProperty(PropertyName = "g-recaptcha-response"), DataMember(Name = "g-recaptcha-response")]
        public string ReCaptchaResponse { get; set; }
    }
namespace Tournaments.Models.Mvc
{
    public class JsonNetValueProviderFactory : ValueProviderFactory
    {
        public override IValueProvider GetValueProvider(ControllerContext controllerContext)
        {
            // first make sure we have a valid context
            if (controllerContext == null)
                throw new ArgumentNullException("controllerContext");

            // now make sure we are dealing with a json request
            if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
                return null;

            // get a generic stream reader (get reader for the http stream)
            var streamReader = new StreamReader(controllerContext.HttpContext.Request.InputStream);
            // convert stream reader to a JSON Text Reader
            var jsonReader = new JsonTextReader(streamReader);
            // tell JSON to read
            if (!jsonReader.Read())
                return null;

            // make a new Json serializer
            var jsonSerializer = new JsonSerializer();
            jsonSerializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            // add the dyamic object converter to our serializer
            jsonSerializer.Converters.Add(new ExpandoObjectConverter());

            // use JSON.NET to deserialize object to a dynamic (expando) object
            Object jsonObject;
            // if we start with a "[", treat this as an array
            if (jsonReader.TokenType == JsonToken.StartArray)
                jsonObject = jsonSerializer.Deserialize<List<ExpandoObject>>(jsonReader);
            else
                jsonObject = jsonSerializer.Deserialize<ExpandoObject>(jsonReader);

            // create a backing store to hold all properties for this deserialization
            var backingStore = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
            // add all properties to this backing store
            AddToBackingStore(backingStore, String.Empty, jsonObject);
            // return the object in a dictionary value provider so the MVC understands it
            return new DictionaryValueProvider<object>(backingStore, CultureInfo.CurrentCulture);
        }

        private static void AddToBackingStore(Dictionary<string, object> backingStore, string prefix, object value)
        {
            var d = value as IDictionary<string, object>;
            if (d != null)
            {
                foreach (KeyValuePair<string, object> entry in d)
                {
                    AddToBackingStore(backingStore, MakePropertyKey(prefix, entry.Key), entry.Value);
                }
                return;
            }

            var l = value as IList;
            if (l != null)
            {
                for (int i = 0; i < l.Count; i++)
                {
                    AddToBackingStore(backingStore, MakeArrayKey(prefix, i), l[i]);
                }
                return;
            }

            // primitive
            backingStore[prefix] = value;
        }

        private static string MakeArrayKey(string prefix, int index)
        {
            return prefix + "[" + index.ToString(CultureInfo.InvariantCulture) + "]";
        }

        private static string MakePropertyKey(string prefix, string propertyName)
        {
            return (String.IsNullOrEmpty(prefix)) ? propertyName : prefix + "." + propertyName;
        }
    }
}
[HttpPost]
public virtual ActionResult Index([ModelBinder(typeof(JsonNetModelBinder))]ContactUsModel model)
{
    _contactUsService.ContactUs(model);

    return Json(new SuccessResponse("Submitted Successfully"));
}
namespace Tournaments.Models.Mvc
{
公共类JsonNetValueProviderFactory:ValueProviderFactory
{
公共覆盖IValueProvider GetValueProvider(ControllerContext ControllerContext)
{
//首先确保我们有一个有效的上下文
如果(controllerContext==null)
抛出新ArgumentNullException(“controllerContext”);
//现在确保我们正在处理一个json请求
if(!controllerContext.HttpContext.Request.ContentType.StartsWith(“application/json”,StringComparison.ordinallingorecase))
返回null;
//获取通用流读取器(获取http流的读取器)
var streamReader=newstreamreader(controllerContext.HttpContext.Request.InputStream);
//将流读取器转换为JSON文本读取器
var jsonReader=新的JsonTextReader(streamReader);
//告诉JSON阅读
如果(!jsonReader.Read())
返回null;
//创建一个新的Json序列化程序
var jsonSerializer=新的jsonSerializer();
jsonSerializer.ReferenceLoopHandling=ReferenceLoopHandling.Ignore;
//将dyamic对象转换器添加到我们的序列化程序中
添加(新的ExpandoObjectConverter());
//使用JSON.NET将对象反序列化为动态(expando)对象
对象jsonObject;
//如果以“[”开头,则将其视为数组
if(jsonReader.TokenType==JsonToken.StartArray)
jsonObject=jsonSerializer.Deserialize(jsonReader);
其他的
jsonObject=jsonSerializer.Deserialize(jsonReader);
//创建备份存储以保存此反序列化的所有属性
var backingStore=新字典(StringComparer.OrdinalIgnoreCase);
//将所有属性添加到此备份存储
AddToBackStore(backingStore,String.Empty,jsonObject);
//在字典值提供程序中返回对象,以便MVC理解它
返回新的DictionaryValueProvider(backingStore,CultureInfo.CurrentCulture);
}
私有静态void addToBackStore(字典备份存储、字符串前缀、对象值)
{
var d=作为IDictionary的值;
如果(d!=null)
{
foreach(d中的KeyValuePair条目)
{
AddToBackStore(backingStore,MakePropertyKey(前缀,entry.Key),entry.Value);
}
返回;
}
var l=作为IList的值;
如果(l!=null)
{
对于(int i=0;i
尝试ModelBinder。由于ExpandoObject,ValueProviderFactory无法工作

internal class JsonNetModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            controllerContext.HttpContext.Request.InputStream.Position = 0;
            var stream = controllerContext.RequestContext.HttpContext.Request.InputStream;
            var readStream = new StreamReader(stream, Encoding.UTF8);
            var json = readStream.ReadToEnd();
            return JsonConvert.DeserializeObject(json, bindingContext.ModelType);
        }
    }
ContactUsController.cs

 [HttpPost]
        public virtual ActionResult Index(ContactUsModel model)
        {
            _contactUsService.ContactUs(model);

            return Json(new SuccessResponse("Submitted Successfully"));
        }
[JsonObject, DataContract]
    public class ContactUsModel
    {
        public string Name { get; set; }
        public string Email { get; set; }
        public string Message { get; set; }

        [JsonProperty(PropertyName = "g-recaptcha-response"), DataMember(Name = "g-recaptcha-response")]
        public string ReCaptchaResponse { get; set; }
    }
namespace Tournaments.Models.Mvc
{
    public class JsonNetValueProviderFactory : ValueProviderFactory
    {
        public override IValueProvider GetValueProvider(ControllerContext controllerContext)
        {
            // first make sure we have a valid context
            if (controllerContext == null)
                throw new ArgumentNullException("controllerContext");

            // now make sure we are dealing with a json request
            if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
                return null;

            // get a generic stream reader (get reader for the http stream)
            var streamReader = new StreamReader(controllerContext.HttpContext.Request.InputStream);
            // convert stream reader to a JSON Text Reader
            var jsonReader = new JsonTextReader(streamReader);
            // tell JSON to read
            if (!jsonReader.Read())
                return null;

            // make a new Json serializer
            var jsonSerializer = new JsonSerializer();
            jsonSerializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            // add the dyamic object converter to our serializer
            jsonSerializer.Converters.Add(new ExpandoObjectConverter());

            // use JSON.NET to deserialize object to a dynamic (expando) object
            Object jsonObject;
            // if we start with a "[", treat this as an array
            if (jsonReader.TokenType == JsonToken.StartArray)
                jsonObject = jsonSerializer.Deserialize<List<ExpandoObject>>(jsonReader);
            else
                jsonObject = jsonSerializer.Deserialize<ExpandoObject>(jsonReader);

            // create a backing store to hold all properties for this deserialization
            var backingStore = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
            // add all properties to this backing store
            AddToBackingStore(backingStore, String.Empty, jsonObject);
            // return the object in a dictionary value provider so the MVC understands it
            return new DictionaryValueProvider<object>(backingStore, CultureInfo.CurrentCulture);
        }

        private static void AddToBackingStore(Dictionary<string, object> backingStore, string prefix, object value)
        {
            var d = value as IDictionary<string, object>;
            if (d != null)
            {
                foreach (KeyValuePair<string, object> entry in d)
                {
                    AddToBackingStore(backingStore, MakePropertyKey(prefix, entry.Key), entry.Value);
                }
                return;
            }

            var l = value as IList;
            if (l != null)
            {
                for (int i = 0; i < l.Count; i++)
                {
                    AddToBackingStore(backingStore, MakeArrayKey(prefix, i), l[i]);
                }
                return;
            }

            // primitive
            backingStore[prefix] = value;
        }

        private static string MakeArrayKey(string prefix, int index)
        {
            return prefix + "[" + index.ToString(CultureInfo.InvariantCulture) + "]";
        }

        private static string MakePropertyKey(string prefix, string propertyName)
        {
            return (String.IsNullOrEmpty(prefix)) ? propertyName : prefix + "." + propertyName;
        }
    }
}
[HttpPost]
public virtual ActionResult Index([ModelBinder(typeof(JsonNetModelBinder))]ContactUsModel model)
{
    _contactUsService.ContactUs(model);

    return Json(new SuccessResponse("Submitted Successfully"));
}

把你的问题从所有不相关的代码中剥离出来会有很大帮助:)对不起,这对你的读者来说太复杂了