2010-03-09 16 views
26

में चयनित आइटम की स्थापना मैंने देखा asp.net MVC में एक बग मेरे लिए क्या लगता है या बस मैं कुछ गलत कर रहा हूँ। मैं वर्तमान में 1.0 का उपयोग कर रहा हूं इसलिए शायद यह कुछ ऐसा है जिसे 2.0 रिलीज में संबोधित किया जाएगा। लेकिन किसी भी तरह से, हम यहां जाते हैं।DropDownList asp.net MVC के

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

यहाँ मेरे विचार है, जहां घोषित आईडी मॉडल में अपनी सूची के रूप में ही नाम है:

<table border="0" cellpadding="0" cellspacing="0"> 
    <tr> 
     <td> 
     <%= Html.DropDownList("IsMultipleServicers", Model.IsMultipleServicers) %> 
     </td> 
    </tr> 
</table> 

और गाया एचटीएमएल

<table border="0" cellpadding="0" cellspacing="0"> 
     <tr> 
     <td> 
      <select id="IsMultipleServicers" name="IsMultipleServicers"> 
       <option value="false">No</option> 
       <option value="true">Yes</option> 
      </select> 
     </td> 
     </tr> 
</table> 

अब एक करने की सुविधा देता छोटा सा बदलाव। मैं घोषित आईडी को कुछ अलग करने के लिए बदल दूंगा।

<table border="0" cellpadding="0" cellspacing="0"> 
    <tr> 
     <td> 
      <%= Html.DropDownList("MultipleServicers", Model.IsMultipleServicers) %> 
     </td> 
    </tr> 
</table> 

और अब गाया एचटीएमएल:

<table border="0" cellpadding="0" cellspacing="0"> 
    <tr> 
     <td> 
     <select id="IsMultipleServicers" name="IsMultipleServicers"> 
      <option value="false">No</option> 
      <option selected="selected" value="true">Yes</option> 
     </select> 
     </td> 
    </tr> 
</table> 

सूचना है कि अब मैं एक चयनित विकल्प जो सूची में दूसरा तत्व होगा मिल

यहाँ मेरी दृश्य है।

यहाँ मेरी ViewModel बस सब कुछ एक साथ टाई करने के लिए है:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace MVCProject.Models.ViewModels.Service 
{ 
    public class ServiceViewModel : ViewModel 
    { 
     public List<SelectListItem> IsMultipleServicers { get; set; } 
    } 
} 

यहाँ मेरी कार्रवाई है:

[AcceptVerbs(HttpVerbs.Get)] 
public virtual ActionResult Service() 
{ 
    return View(new ServiceViewModel() 
    { 
     IsMultipleServicers = BuildBooleanSelectList(true) 
    }; 
} 

private List<SelectListItem> BuildBooleanSelectList(bool isTrue) 
{ 
    List<SelectListItem> list = new List<SelectListItem>(); 

    if (isTrue) 
    { 
     list.Add(new SelectListItem() { Selected = false, Text = "No", Value = "false" }); 
     list.Add(new SelectListItem() { Selected = true, Text = "Yes", Value = "true" }); 
    } 
    else 
    { 
     list.Add(new SelectListItem() { Selected = true, Text = "No", Value = "false" }); 
     list.Add(new SelectListItem() { Selected = false, Text = "Yes", Value = "true" }); 
    } 
return list; 
    } 

उत्तर

43

मुझे लगता है कि समस्या DropDownList भार के बारे में एक भ्रम की स्थिति है:

  1. Html.DropDownList(string name)name के एक दृश्य मॉडल संपत्ति के लिए लग रहा है और टाइप IEnumerable<SelectListItem>। यह सूची से चयनित आइटम (SelectListItem.Selected == true) का उपयोग करेगा जब तक कि वहाँ एक ही नाम के एक फार्म के बाद मूल्य है।

  2. Html.DropDownList(string name, IEnumerable<SelectListItem> selectList)selectList से आइटम का उपयोग करता है, लेकिन उनके चयनित मूल्य नहीं। चयनित दृश्य मॉडल (या पोस्ट डेटा) में name को हल करने और SelectListItem.Value के खिलाफ मिलान करके पाया जाता है। भले ही मान नहीं मिला (या शून्य है), फिर भी यह चयनित मूल्य का चयन SelectListItems की सूची से नहीं करेगा।

आपका कोड दूसरा अधिभार का उपयोग करता है, लेकिन एक "मूल्य" संपत्ति जो मौजूद नहीं है ("MultipleServicers") निर्दिष्ट करता है।

आपकी समस्या का समाधान करने के लिए, या तो पहले अधिभार का उपयोग करें:

<%= Html.DropDownList("IsMultipleServicers") %> 

या, अपने दृश्य मॉडल के लिए एक string MultipleServicers संपत्ति जोड़ सकते हैं और अपने नियंत्रक में पॉप्युलेट करें।

public class ServiceViewModel : ViewModel 
{ 
    public string MultipleServicers { get; set; } 
    public List<SelectListItem> IsMultipleServicers { get; set; } 
} 
फिर अपने HTML के लिए

:

<%= Html.DropDownList(Model.MultipleServicers, Model.IsMultipleServicers) %> 

इस रूप में यह आरंभिक प्रदर्शन, पोस्ट प्रदर्शन और एक दृश्य/पोस्ट मॉडल करने के लिए पोस्ट डेटा मैप के साथ चारों ओर कई समस्याएं हो जाता है मैं इस समाधान की सलाह देते हैं एमवीसी 2 में तकनीक मानचित्र, साथ ही:

<%= Html.DropDownListFor(x => x.MultipleServicers, Model.IsMultipleServicers) %> 
+0

मेरी इच्छा है कि यह अधिक स्पष्ट था ... लेकिन अब यह समझ में आता है। धन्यवाद – ppumkin

+0

मैं आपको यह सब सलाह दूंगा: http://www.c-sharpcorner.com/UploadFile/4d9083/creating-simple-cascading-dropdownlist-in-mvc-4-using-razor/ – Umitk

2

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

+0

क्या है इसका अच्छा स्पष्टीकरण हो रहा! अपने डिफ़ॉल्ट अभ्यास पर खुद को सेट किया गया - चीजों को स्पष्ट करने का सबसे अच्छा तरीका है, और SelectListItem मानों को उत्पन्न करने में सरल बनाता है। –

9

मुझे Html.DropDownList (स्ट्रिंग नाम, IENumerable selectList) अधिभार का उपयोग करके एक ही समस्या का सामना करना पड़ा। ऐसा प्रतीत होता है कि मेरे मॉडल में ड्रॉप डाउन सूची के नाम के समान नाम की एक संपत्ति है। यह मामला है, एमवीसी ने आईन्यूमेरेबल में प्रत्येक प्रविष्टि की चयनित संपत्ति पर मेरे मॉडल के संपत्ति मूल्य का पक्ष लिया।

समाधान ड्रॉपडाउन सूची के लिए एक नाम का उपयोग करना था जो किसी संपत्ति के नाम से मेल नहीं खाता है। एक और समाधान मेरी अपनी विस्तार विधि लिखना होगा जो मॉडल को अनदेखा करता है और राज्य को देखता है और इसके बजाय हमेशा चयनित संपत्ति का सम्मान करता है।

+1

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