c# - निर्धारित करें कि जब अमान्य JSON कुंजी/मान जोड़े को किसी.NET MVC अनुरोध में भेजा जाता है
asp.net-mvc asp.net-mvc-5 (2)
अच्छी तरह से आप की तरह कुछ बाहर की कोशिश कर सकते हैं
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 ;
}
मेरे पास MVC अनुप्रयोग वाला एक क्लाइंट है जो कच्चे जेएसओएन अनुरोधों को स्वीकार करता है। ModelBinder नियंत्रक मॉडल गुणों के लिए आने वाली कुंजी / मान जोड़े, वहाँ कोई समस्या नहीं है।
समस्या यह है कि वे एक त्रुटि को फेंकना चाहते हैं जब वे एक अमान्य कुंजी / मान जोड़ी भेजते हैं, और मेरे जीवन के लिए मुझे कच्चे इनकमिंग डेटा नहीं मिल सकता है।
उदाहरण के लिए, अगर मेरे पास स्ट्रिंग प्रॉपर्टी MName
साथ एक मॉडल होता है लेकिन उनके JSON अनुरोध में वे "MiddleName":"M"
भेजते हैं "MiddleName":"M"
, MName
इस अमान्य कुंजी को टॉस करेगा और MName
गुण खाली छोड़ MName
। यह कोई त्रुटि नहीं ModelState.IsValid
और ModelState.IsValid
। ModelState.IsValid
रिटर्न true
।
मुझे पता है कि मैं संपत्ति पर एक [Required]
गुण फेंक सकता हूं, लेकिन यह सही नहीं है, या तो, क्योंकि उस सम्पत्ति के लिए शून्य मूल्य हो सकता है, और फिर भी कुंजी / मूल्य जोड़े का पता लगाने की समस्या को नहीं मिलता है जो ' टी संबंधित हैं
यह ओवर-पोस्टिंग का सवाल नहीं है; मैं आने वाले मान को मॉडल से बाध्य करने से रोकने की कोशिश नहीं कर रहा हूं। मैं यह पता लगाने की कोशिश कर रहा हूं कि आने वाले मूल्य में मॉडल में कुछ भी नहीं मैप किया गया था।
चूंकि अनुरोधों में आवेदन / जेएसएन के रूप में मूल्य आ रहे हैं, इसलिए मेरे पास भाग्य भी नहीं है, यहां तक कि गिनती या गणन के साथ, कच्चे अनुरोध डेटा मैं ModelState.Keys
से नाम / वैल्यू युग्म खींच सकता हूं। ModelState.Keys
लेकिन इसमें केवल फ़ील्ड शामिल हैं जो सफलतापूर्वक मैप किए गए थे। इन चाबियों में से कोई भी Request[]
संग्रह में नहीं है
और हाँ, यह एएसपी.नेट एमवीसी 5 में है, वेबएपी नहीं है। क्या वेबएपीआई यह किसी अन्य तरीके से संभालता है?
कोई विचार?
उदाहरण:
एप्लिकेशन / जेसन: {"एफ" नाम: "जो", "एमएननाम": "एम", "एलएन" नाम: "ब्लॉ"}
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)
}
}
आप जेसन डेटा पढ़ सकते हैं जो अनुरोध से अनुरोध में भेजा गया Request.InputStream
और किसी ऑब्जेक्ट को डिसेरीलाइज़ करना। फिर आप संपत्ति के नामों की तुलना कर सकते हैं जो आपके मॉडल के गुण नाम के साथ पोस्ट किए गए थे
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();
यदि invalidProperties
में मान शामिल हैं, तो आप अपनी त्रुटि (और शायद String.Join()
उपयोग कर सकते हैं। अमान्य संपत्ति नामों की सूची और क्लाइंट को लौटाए गए त्रुटि संदेश में वास्तविक मॉडल प्रॉपर्टी नामों की सूची शामिल करने के लिए)।