variable una tipo servicio recorrer objeto leer ejecutar desde crear construir como cadena c# json asp.net-mvc asp.net-mvc-5

una - servicio rest c# json



Determinar cuándo se envían pares clave/valor JSON no válidos en una solicitud.NET MVC (2)

bueno, puedes probar algo como

public ActionResult Save(object commingJson) { PersonModel person = new PersonModel(); try{ person.FName = commingJson.FName; person.LName = commingJson.LName ; } catch(Exception) { //Binding Failed invalid json } int countInObject = GetAttrCount(commingJson); int countInModel = GetAttrCount(person); if(countInObject != countInModel ) { //Json have more or less value then model } if(ModelState.IsValid) // returns true // do things return View(person) } public int GetAttrCount(obecjct countObject) { Type type = typeof(countObject); int attributeCount = 0; foreach(PropertyInfo property in type.GetProperties()) { attributeCount += property.GetCustomAttributes(false).Length; } return attributeCount ; }

Tengo un cliente con una aplicación MVC que acepta solicitudes JSON sin formato. El ModelBinder mapea los pares entrantes de clave / valor a las propiedades del Modelo de Controlador, no hay problema allí.

El problema es que quieren arrojar un error cuando envían un par clave / valor inválido, y por mi vida no puedo encontrar los datos entrantes sin procesar.

Por ejemplo, si tengo un modelo con una propiedad de cadena MName pero en su solicitud JSON envían "MiddleName":"M" , ModelBinder arrojará esta clave inválida y dejará la propiedad MName blanco. Esto no arroja un error y ModelState.IsValid devuelve true .

Sé que podría lanzar un atributo [Required] en la propiedad, pero tampoco está bien, ya que puede haber valores nulos para esa propiedad, y todavía no llega al problema de detectar pares de clave / valor que no funcionan t pertenece.

Esto no es una cuestión de sobre-publicación; No estoy tratando de evitar que un valor entrante se vincule al modelo. Intento detectar cuando un valor entrante simplemente no se correlaciona con nada en el modelo.

Como los valores vienen como application / json en el cuerpo de la solicitud, no estoy teniendo suerte ni siquiera para acceder, dejar de contar o enumerar los datos de solicitud sin procesar. Puedo extraer pares nombre / valor de ModelState.Keys pero eso solo incluye los campos que se asignaron correctamente. Ninguna de estas claves está en la colección Request[] .

Y sí, esto está en ASP.NET MVC 5, no en WebApi. ¿WebAPI maneja esto de manera diferente?

¿Algunas ideas?

Ejemplo:

application / json: {"FName": "Joe", "MName": "M", "LName": "Blow"}

public class PersonModel { public string FName { get; set; } public string LName { get; set; } } public class PersonController() : Controller { public ActionResult Save(PersonModel person) { if(ModelState.IsValid) // returns true // do things return View(person) } }


Puede leer datos json que se enviaron en la solicitud de Request.InputStream y deserializar a un objeto. A continuación, puede comparar los nombres de propiedad que se publicaron con los nombres de propiedad de su modelo

public ActionResult Save(PersonModel person) { // Get the models property names var modelProperties = person.GetType().GetProperties().Select(x => x.Name); // Read the InputStream StreamReader reader = new StreamReader(Request.InputStream); reader.BaseStream.Position = 0; string jsonText = reader.ReadToEnd(); // Deserialize to object and read property names JavaScriptSerializer serializer = new JavaScriptSerializer(); object jsonObject = serializer.DeserializeObject(jsonText); IDictionary<string, object> dictionary = jsonObject as IDictionary<string, object>; var jsonProperties = jsonObject.Keys; // Get the json property names which do not match the model property names List<string> invalidProperties = jsonProperties.Except(modelProperties, StringComparer.OrdinalIgnoreCase).ToList();

Si invalidProperties contiene valores, entonces podría lanzar su error (y tal vez usar String.Join() para incluir la lista de los nombres de propiedad no válidos y la lista de nombres de propiedad del modelo real en el mensaje de error que se devuelve al cliente).