2011-12-21 5 views
28

तो मेरा कोड पहले काम कर रहा था। मुझे नहीं पता कि मैंने ऐसा करने के लिए क्या किया और मैं इसे ठीक नहीं कर सकता। मैंने लोगों को मॉडलस्टेट को रीसेट करने के लिए कहा है। (ModelState.Clear();) लेकिन इससे मदद नहीं मिली। इसके अलावा, यह मदद नहीं करता है कि मैं अभी भी एमवीसी के लिए बिल्कुल नया हूँ। किसी भी सहायता की सराहना की जाएगी। धन्यवाद।व्यूडाटा आइटम जिसमें कुंजी 'Category आईडी' है, 'System.Int32' प्रकार का है, लेकिन 'IEnumerable <SelectListItem>' प्रकार का होना चाहिए?

नियंत्रक:

public ActionResult Create() 
    { 
     ActiveDirectoryModel adm = new ActiveDirectoryModel(); 
     ViewBag.notifyto = adm.FetchContacts(); 
     var model = Populate(); 


     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Create(CreateViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      model.leaf.Date = DateTime.Now.Date; 
      model.leaf.Category = model.CategoryId; 
      model.leaf.SubCategory = model.SubCategoryId; 
      model.leaf.AssignedTo = model.AssignedToId; 
      model.leaf.CoAssignedTo = model.CoAssignedToId; 
      model.leaf.Status = model.StatusId; 
      model.leaf.Priority = model.PriorityId; 
      //model.lead.Parent = model.ParentID; 

      db.LeafItems.AddObject(model.leaf); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(model); 
    } 

    public CreateViewModel Populate() 
    { 
     ActiveDirectoryModel adm = new ActiveDirectoryModel(); 
     var model = new CreateViewModel 
     { 
      AssignedToItems = adm.FetchContacts(), 
      CoAssignedToItems = adm.FetchContacts(), 
      NotifyToItems = adm.FetchContacts(), 
      CategoryItems = 
       from c in new IntraEntities().CategoryItems.ToList() 
       select new SelectListItem 
       { 
        Text = c.Name, 
        Value = c.ID.ToString() 
       }, 
      SubCategoryItems = 
       from sc in new IntraEntities().SubCategoryItems.ToList() 
       select new SelectListItem 
       { 
        Text = sc.Name, 
        Value = sc.ID.ToString() 
       }, 
      StatusItems = 
       from s in new IntraEntities().StatusItems.ToList() 
       where s.IsPriority == false 
       select new SelectListItem 
       { 
        Text = s.Name, 
        Value = s.ID.ToString() 
       }, 
      PriorityItems = 
       from p in new IntraEntities().StatusItems.ToList() 
       where p.IsPriority == true 
       select new SelectListItem 
       { 
        Text = p.Name, 
        Value = p.ID.ToString() 
       } 
     }; 
     return model; 
    } 

दृश्य:

<div class="createTopInner"> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.leaf.Category) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => model.CategoryId, Model.CategoryItems, "") 
     @Html.ValidationMessageFor(model => model.leaf.Category) 
    </div> 
</div> 

मॉडल:

public int CategoryId { get; set; } 
    public IEnumerable<SelectListItem> CategoryItems { get; set; } 
+1

मॉडलस्टेट.इस्वालिड = झूठी अगर मैंने अपनी जनसंख्या विधि को चलाकर समस्या को ठीक किया। एक बार 8 घंटे गुजरने के बाद मैं इसे एक वास्तविक उत्तर के रूप में पोस्ट कर सकता हूं। मैं नहीं चाहता कि कोई भी तब तक अपना समय बर्बाद कर रहा हो। – Ber53rker

उत्तर

51

अपने ModelState अपनी पोस्ट कार्रवाई पर मान्य नहीं है, तो आप अपने selectList गुण फिर से आबाद करने की जरूरत है:

if(ModelState.IsValid) 
{ 
    // save and redirect 
    // ... 
} 

// repopulate your SelectList properties: 
model.CategoryItems = GetCategories(); 

return View(model); 

पूरे मॉडल को दोबारा न बदलें क्योंकि अन्यथा आप उपयोगकर्ता द्वारा किए गए किसी भी बदलाव को संभावित रूप से खो सकते हैं।

+0

धन्यवाद। यह अभी भी मूल्यों को बनाए रख रहा है। लेकिन आपका समाधान स्पष्ट रूप से सुरक्षित मार्ग है। – Ber53rker

+0

@ डिस्मिसाइल आप इसके बारे में कुछ और जानकारी प्रदान कर सकते हैं। हमें चयन सूची को दोबारा बदलने की जरूरत क्यों है और इसका कोई दुष्प्रभाव है। धन्यवाद –

+1

@AneneeshSrivastava एमवीसी स्टेटलेस है। जब आप कोई पोस्ट करते हैं तो यह पूरे दृश्य को फिर से प्रस्तुत करने जा रहा है और आपके पास मौजूद सभी डेटा POST में नहीं भेजे जा रहे हैं। जब आप फॉर्म जमा करते हैं तो आपको केवल चयनित मान सबमिट किया जाता है, न कि आइटम की पूरी सूची। आपको इसे दोबारा स्थापित करने की जरूरत है ताकि उसकी पूरी सूची फिर से हो। – Dismissile

0

एक और तरीका मुझे पता चला है कि समाधान छुपा हुआ क्षेत्र लेता है। तो आपके मामले में आप नीचे के रूप में कर सकते हैं:

@Html.HiddenFor(model => model.CategoryId) 

अब किसी अन्य फ़ील्ड फॉर्म के साथ संबंधित मॉडल में श्रेणी आईडी सेट और सेट करें।

संबंधित मुद्दे

 संबंधित मुद्दे