2012-04-06 10 views
17

मैंने खोज करने की कोशिश की और मेरी समस्या को ठीक करने वाले कुछ भी नहीं मिला। मेरे पास एक रेजर व्यू पर ड्रॉपडाउनलिस्ट है जो उस आइटम को नहीं दिखाएगा जिसे मैंने सिलेक्टलिस्ट में चुना है।एमवीसी ड्रॉपडाउनलिस्ट चयनित वैल्यू सही ढंग से प्रदर्शित नहीं कर रहा है

var statuses = new SelectList(db.OrderStatuses, "ID", "Name", order.Status.ID.ToString()); 
ViewBag.Statuses = statuses; 
return View(vm); 

यहाँ है देखें कोड:

<div class="display-label"> 
    Order Status</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(model => model.StatusID, (SelectList)ViewBag.Statuses) 
    @Html.ValidationMessageFor(model => model.StatusID) 
</div> 

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

+0

नीचे दिए गए लिंक देखें। http://stackoverflow.com/questions/5188563/asp-net-mvc-drop-down-list-selection-partial-views-and-model-binding –

+0

alok_dida, मैं उस पर देखा, यह बहुत लग रहा है सिवाय इसके कि सिलेक्टलिस्ट का चयन करने में चयनित मान पूरे ऑब्जेक्ट बनाम ID.ToString() जैसा मैं कर रहा हूं। हालांकि मैंने अपना कोड वही करने के लिए बदल दिया और इसने समस्या को हल नहीं किया। क्या उन दोनों के बीच कुछ अंतर है जो मुझे याद आ रही हैं जो मेरी समस्या को ठीक करेगी? – azorr

+1

मैंने एक विस्तृत उदाहरण जोड़ा कि यह कैसे किया जा सकता है। इस –

उत्तर

40

SelectList निर्माता (जिसमें आपके द्वारा चयनित मूल्य आईडी पारित करने के लिए सक्षम होने की आशा) की अंतिम तर्क को नजरअंदाज कर दिया क्योंकि DropDownListFor सहायक लैम्ब्डा अभिव्यक्ति आप पहले तर्क के रूप में पारित उपयोग करता है और विशिष्ट संपत्ति के मूल्य का उपयोग करता है।

तो यहाँ करने के लिए बदसूरत तरीका है कि:

मॉडल:

public class MyModel 
{ 
    public int StatusID { get; set; } 
} 

नियंत्रक:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     // TODO: obviously this comes from your DB, 
     // but I hate showing code on SO that people are 
     // not able to compile and play with because it has 
     // gazzilion of external dependencies 
     var statuses = new SelectList(
      new[] 
      { 
       new { ID = 1, Name = "status 1" }, 
       new { ID = 2, Name = "status 2" }, 
       new { ID = 3, Name = "status 3" }, 
       new { ID = 4, Name = "status 4" }, 
      }, 
      "ID", 
      "Name" 
     ); 
     ViewBag.Statuses = statuses; 

     var model = new MyModel(); 
     model.StatusID = 3; // preselect the element with ID=3 in the list 
     return View(model); 
    } 
} 

दृश्य:

@model MyModel 
...  
@Html.DropDownListFor(model => model.StatusID, (SelectList)ViewBag.Statuses) 

और यहाँ सही तरीका नहीं है, वास्तविक दृश्य मॉडल का उपयोग:

मॉडल

public class MyModel 
{ 
    public int StatusID { get; set; } 
    public IEnumerable<SelectListItem> Statuses { get; set; } 
} 

नियंत्रक:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     // TODO: obviously this comes from your DB, 
     // but I hate showing code on SO that people are 
     // not able to compile and play with because it has 
     // gazzilion of external dependencies 
     var statuses = new SelectList(
      new[] 
      { 
       new { ID = 1, Name = "status 1" }, 
       new { ID = 2, Name = "status 2" }, 
       new { ID = 3, Name = "status 3" }, 
       new { ID = 4, Name = "status 4" }, 
      }, 
      "ID", 
      "Name" 
     ); 
     var model = new MyModel(); 
     model.Statuses = statuses; 
     model.StatusID = 3; // preselect the element with ID=3 in the list 
     return View(model); 
    } 
} 

दृश्य:

@model MyModel 
...  
@Html.DropDownListFor(model => model.StatusID, Model.Statuses) 
+0

उत्कृष्ट उत्तर, समस्या को समझाते हुए और इसे ठीक करने का उदाहरण देने के लिए धन्यवाद। सहायता के लिए धनयवाद। – azorr

+0

मैं वास्तव में नहीं समझता कि स्टेटस आईडी कहां बांधता है? चयनित मूल्य 'चयन सूची' का चौथा मूल्य नहीं है? आपने वास्तव में उस कहीं भी चयनसूची को नहीं बताया था? क्या यह सिर्फ पता है या मैं पागल हो रहा हूँ? मैं इसे कई ड्रॉपडाउन को पूर्व निर्धारित करने के लिए काम नहीं कर सकता :( – ppumkin

+2

@ppumkin, नहीं, जब आप एक व्यू मॉडल का उपयोग करते हैं और दृढ़ता से टाइप किया गया है तो आपको सिलेक्टलिस्ट कन्स्ट्रक्टर के चौथे तर्क की आवश्यकता नहीं है। यही है 'x => x.StatusID जैसा कि आप मेरे उदाहरण से देख सकते हैं, मैंने चयनसूची निर्माता का भी उपयोग नहीं किया क्योंकि मेरा व्यू मॉडल प्रॉपर्टी 'IENumerable ' है और सीधे ड्रॉपडाउनलिस्ट के लिए बाध्य हो सकती है। –

-3

कृपया नीचे नमूना कोड ढूँढ़ने।

public class Temp 
    { 
     public int id { get; set; } 
     public string valueString { get; set; } 
    } 

नियंत्रक

public ActionResult Index() 
     { 
      // Assuming here that you have written a method which will return the list of Temp objects. 
      List<Temp> temps = GetList(); 

      var tempData = new SelectList(temps, "id", "valueString",3); 
      ViewBag.Statuses = tempData; 

      return View(); 
     } 

देखें

@Html.DropDownListFor(model => model.id, (SelectList)ViewBag.Statuses) 
    @Html.ValidationMessageFor(model => model.id) 
+5

मेरी आंखें जलती हुई हैं .... aaaaaaaaaaaa .. वह क्या है? – ppumkin

+0

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

+0

दोस्तों, यह सिर्फ एक उदाहरण था। उपयोगकर्ता वैसे भी एक सूची बना सकते हैं। जिस तरह से मैंने एक सूची बनाई, जिसने उसके लिए कोई समझ नहीं ली क्योंकि उसका अपना संग्रह होगा। रेखा जो उसके से मायने रखती है वह सी # से कोड की अंतिम 2 पंक्तियां और HTML से कोड की 2 पंक्तियां हैं। कृपया तर्क के बिना कोड को कम मत करें। आप पोस्ट को भी संपादित कर सकते हैं। यदि यह गलत है तो आप उत्तर को कम कर सकते हैं। इस कोड में गलत बात क्या है? –

2

प्रत्येक दृश्य के लिए एक दृश्य के मॉडल बनाएं। इस तरह से आप स्क्रीन पर क्या जरूरत है केवल शामिल करेंगे। जैसा कि मुझे नहीं पता कि आप इस कोड का उपयोग कहां कर रहे हैं, आइए मान लें कि आपके पास नया ऑर्डर जोड़ने के लिए एक व्यू व्यू है।

public class OrderCreateViewModel 
{ 
    // Include other properties if needed, these are just for demo purposes 

    // This is the unique identifier of your order status, 
    // i.e. foreign key in your order table 
    public int OrderStatusId { get; set; } 
    // This is a list of all your order statuses populated from your order status table 
    public IEnumerable<OrderStatus> OrderStatuses { get; set; } 
} 

ऑर्डर की स्थिति वर्ग:

अपने बनाएं दृश्य के लिए कोई नया दृश्य मॉडल बनाएं

public class OrderStatus 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

अपने में दृश्य बनाएँ आप निम्नलिखित होंगे:

@model MyProject.ViewModels.OrderCreateViewModel 

@using (Html.BeginForm()) 
{ 
    <table> 
      <tr> 
       <td><b>Order Status:</b></td> 
       <td> 
        @Html.DropDownListFor(x => x.OrderStatusId, 
         new SelectList(Model.OrderStatuses, "Id", "Name", Model.OrderStatusId), 
         "-- Select --" 
        ) 
        @Html.ValidationMessageFor(x => x.OrderStatusId) 
       </td> 
      </tr> 
    </table> 

    <!-- Add other HTML controls if required and your submit button --> 
} 

आपका क्रिया विधियां बनाएं:

public ActionResult Create() 
{ 
    OrderCreateViewModel viewModel = new OrderCreateViewModel 
    { 
      // Here you do database call to populate your dropdown 
      OrderStatuses = orderStatusService.GetAllOrderStatuses() 
    }; 

    return View(viewModel); 
} 

[HttpPost] 
public ActionResult Create(OrderCreateViewModel viewModel) 
{ 
    // Check that viewModel is not null 

    if (!ModelState.IsValid) 
    { 
      viewModel.OrderStatuses = orderStatusService.GetAllOrderStatuses(); 

      return View(viewModel); 
    } 

    // Mapping 

    // Insert order into database 

    // Return the view where you need to be 
} 

जब आप सबमिट बटन पर क्लिक करते हैं तो यह आपके चयनों को जारी रखेगा और त्रुटि प्रबंधन के लिए दृश्य दृश्य पर वापस रीडायरेक्ट किया जाएगा।

मुझे उम्मीद है कि इससे मदद मिलती है।

1

सुनिश्चित करें कि आपका रिटर्न चयन मूल्य एक स्ट्रिंग है और जब आप इसे अपने मॉडल में घोषित करते हैं तो नहीं।

उदाहरण:

public class MyModel 
{ 
    public string StatusID { get; set; } 
} 
संबंधित मुद्दे