मेरे पास कुछ सत्यापन नियमों वाला एक मॉडल है जैसे न्यूनतम स्ट्रिंग लंबाई 12।

public class Client{
    [Required("ID Cannot be empty")]
    [StringLength(12, ErrorMessage="ID must have 12 characters", MinimumLength = 12)]
    public string Id { get; set; }
    
    [Required("Name cannot be empty")]
    [StringLength(60, ErrorMessage="Must be between 10 and 60 characters", MinimumLength = 10)]
    public string FullName { get; set; }

    [Required("Phone cannot be empty")]
    [StringLength(9, ErrorMessage="Phone number must have 9 characters", MinimumLength = 9)]
    public string PhoneNumber { get; set; }

    [Required("Client needs a status")]
    public bool PremiumStatus { get; set; }
  
}

ये नियम मेरे पास एक Registration दृश्य में काम करते हैं, जिसका अर्थ है कि मुझे सत्यापन संदेश देखने को मिलते हैं और यदि यह मान्य नहीं है तो मॉडल पंजीकृत नहीं है। हालांकि, मेरे खोज/संपादन दृश्य में, जहां मुझे एक आईडी देखने और लौटाए गए मॉडल को संशोधित करने में सक्षम होना चाहिए, कोई भी परिवर्तन पंजीकृत नहीं हो रहा है, और ऐप को डीबग करने पर, मैं देखता हूं कि मॉडल के लिए ModelState हमेशा अमान्य है, हालांकि, साथ ही, मुझे कोई सत्यापन संदेश नहीं दिख रहा है

@model MyApp.Models.Client
@{
    ViewBag.Title = "MyApp"
}

@using(Html.BeginForm("Search", "Search", FormMethod.Post)){
    Search for ID: @Html.TextBox("SearchId")
    <input type="submit" value="Search"/>
}
@using(Html.BeginForm("EditClient", "Search", FormMethod.Post)){
    @Html.LabelFor(m => m.Id)
    @Html.DisplayFor(m => m.Id)

    @Html.LabelFor(m => m.FullName)
    @Html.EditorFor(m => m.FullName)
    @Html.ValidationMessageFor(m => m.FullName)

    @Html.LabelFor(m => m.PhoneNumber)
    @Html.EditorFor(m => m.PhoneNumber)
    @Html.ValidationMessageFor(m => m.PhoneNumber)

    @Html.LabelFor(m => m.PremiumStatus)
    @Html.EditorFor(m => m.PremiumStatus)
    @Html.ValidationMessageFor(m => m.PremiumStatus)

    <input type="submit" value="Save Changes"/>

}

ध्यान दें कि मैं केवल नाम, फोन और स्थिति को संपादित करना चाहता हूं। मैं आईडी संपादित नहीं करना चाहता, इसलिए यह केवल एक प्रदर्शन फ़ील्ड है

अब मेरे नियंत्रक पर

public class SearchController : Controller {
    public ActionResult Search() {
        return View();
    }


    [HttpPost]
    public ActionResult Search(string SearchId) {
        //Searching my Session variable to retrieve Client item related to the code searched.
        //I have validations in place in case the ID doesn't exist, but I'm not showing them to keep the code simple.
        Client clientFound = (Client) Session[SearchId];
        //Returns the view with the found model, populating all of the fields in the view.
        return View("Search", clientFound)
    }
     [HttpPost]
     //I just added these 2 annotations, but it wasn't working without them either
     [ValidateAntiForgeryToken]
     [ValidateInput(true)]
     public ActionResult EditClient(Client model) {
         if(ModelState.IsValid){
             Session[model.Id] = model;
             Debug.WriteLine("Client updated");
             
         } 
         return RedirectToAction("Search");
     }
}

ब्रेकप्वाइंट सेट करके, मैं देख सकता था कि एक बार EditClient के अंदर, मॉडल में सही, नए अपडेट किए गए गुण हैं। यह सिर्फ इतना है कि इसे हमेशा अमान्य माना जाता है। और जैसा कि पहले उल्लेख किया गया है, भले ही मैं संपादन योग्य फ़ील्ड से सब कुछ हटा दूं, मुझे यह दिखाने वाला त्रुटि संदेश नहीं मिलता है कि वे अमान्य हैं।

0
Dasph 27 जून 2021, 20:20

2 जवाब

सबसे बढ़िया उत्तर

आपके Client मॉडल पर प्रॉपर्टी Id की आवश्यकता है।

चूंकि यह आवश्यक है, इसलिए आपको यह सुनिश्चित करने की आवश्यकता है कि आपके पास आपकी Id संपत्ति के अनुरूप एक इनपुट फ़ील्ड है, जो मुझे आपके .cshtml पर इसके अनुरूप कोई भी input फ़ील्ड नहीं मिला।

आप एक @Html.HiddenFor(m => m.Id) (जो एक प्रकार की छिपी हुई इनपुट फ़ील्ड है) शामिल कर सकते हैं ताकि जब आप फ़ॉर्म सबमिट करें Id तब भी पोस्ट में शामिल रहे।

1
tontonsevilla 28 जून 2021, 04:49

मुझे लगता है कि आपको ASP.NET में ModelState के बारे में और पढ़ना चाहिए।

यहां कुछ स्टैक ओवरफ्लो उत्तर दिए गए हैं जो माइक्रोसॉफ्ट आधिकारिक दस्तावेज के साथ सहायक हो सकते हैं।

  1. ModelState.IsValid क्या करता है?
  2. https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api
  3. https://www.exceptionnotfound.net/asp-net-mvc-demystified-modelstate/

अब अपने प्रश्न पर थोड़ा प्रकाश डालते हैं। आवश्यक के रूप में सेट किए गए आपके एक फ़ील्ड में वह डेटा प्रकार या सामग्री नहीं है जिसकी इस फ़ील्ड के लिए आपकी कार्रवाई अपेक्षित है, उपयुक्त डेटा प्रकार के साथ सेट नहीं की गई है। मैं स्वाभाविक रूप से सुझाव दूंगा कि संपादन और खोज सुविधा के लिए आपको मॉडलस्टेट के बजाय सत्यापन के अन्य रूपों का उपयोग करना चाहिए। तो एक काल्पनिक समाधान के लिए आपके संपादन दृश्य में स्वाभाविक रूप से एक मोडल दृश्य की तरह होना चाहिए, जहां अगर मैं एक विस्तृत चयन करता हूं तो यह मुझे वर्तमान डेटा दिखाता है जो इस उपयोगकर्ता की जानकारी उपयोगकर्ता आईडी द्वारा प्राप्त कर रहा है। तो मैं सामग्री और उपयोगकर्ता आईडी के साथ अपना संपादन जमा कर सकता हूं, फिर यह डेटाबेस को नए डेटा के साथ अपडेट करेगा जहां आईडी द्वारा एक मैच है, इस धारणा के साथ कि आईडी प्रत्येक उपयोगकर्ता के लिए अद्वितीय है।

धन्यवाद कृपया साझा किए गए लिंक पढ़ें।

0
AKINNUBI ABIOLA SYLVESTER 27 जून 2021, 20:36