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.IsValidModelState.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() उपयोग कर सकते हैं। अमान्य संपत्ति नामों की सूची और क्लाइंट को लौटाए गए त्रुटि संदेश में वास्तविक मॉडल प्रॉपर्टी नामों की सूची शामिल करने के लिए)।