2012-03-23 17 views
13

के बारे में इन प्रश्नों में से एक प्रश्न "चयनित" मान का चयन नहीं कर रहा है।DropDownListFor - "चयनित" मान का चयन नहीं करता

मॉडल::

public class CreateEditAccountModel 
{ 
    [Required] 
    [Display(Name = "Permission")] 
    public int PermissionId { get; set; } 
    public IEnumerable<SelectListItem> Permissions { get; set; } 
} 

नियंत्रक:

[HttpGet] 
[Authorize] 
public ActionResult EditAccount(int id) 
{ 
    CreateEditAccountModel model = new CreateEditAccountModel(); 
    model.Permissions = PermissionsAll(); 
    return View("CreateEditAccount", model); 
} 

इस बात अगर मैं वापसी लाइन पर एक को तोड़ने बिंदु डाल पर, model.Permissions उचित IEnumerable<SelectListItem> वस्तु शामिल यहाँ कोड है कई वस्तुओं और केवल एक के साथ, जिसमें Selected = true है।

दृश्य:

@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(m => m.PermissionId, Model.Permissions) 
} 

रेंडर:

<select id="PermissionId" name="PermissionId"> 
    <option value="">-- Select --</option> 
    <option value="1">Permission one</option> 
    <option value="2">Permission two</option> 
</select> 

किसी कारण से विकल्प और पहले विकल्प में से किसी पर कोई चयनित विशेषता का चयन किया जाता है।

किसी भी मदद की सराहना की जाती है।


अद्यतन

ऐसा प्रतीत होता है कि यह इस article के साथ कुछ है। इस आलेख के समाधान को सारांशित करने के लिए, मुझे यह सुनिश्चित करना होगा कि संपत्ति का नाम (@html.DropDownList का पहला तर्क) मॉडल के किसी भी मौजूदा गुण से मेल नहीं खाता है। क्या कोई यह समझा सकता है कि यह मामला क्यों है?

यह सही ढंग से ड्रॉप डाउन renders जब मैं इस तरह दृश्य कुछ में लिखें:

@Html.DropDownList("PermissionIdNotMatching", Model.Permissions) 

हालांकि, यह यह करने के लिए किसी भी तार्किक मतलब नहीं है के बाद से मैं वास्तव में बांधने की मशीन मिलान करने में सक्षम होना चाहता हूँ मॉडल संपत्ति के लिए चयन तत्व का नाम। अन्यथा मुझे मैन्युअल रूप से इस तरह के मूल्य को पकड़ना होगा: Request.Form["PermissionIdNotMatching"];

किसी के पास कोई विचार है?


समाधान

देखें जवाब और इसे करने के लिए पहली टिप्पणी को स्वीकार कर लिया।

+1

PermissionId का मान SelectListItem.Value के बराबर होना चाहिए जिसके लिए चयनित = सत्य। मॉडल का प्रयास करें। PermissionId = Convert.ToInt32 (lst.First (t => t.Selected)। वैल्यू); मुझे आपके द्वारा की गई एक ही समस्या का सामना करना पड़ा, आश्चर्यजनक रूप से संपादन करते समय मूल्य का चयन किया जा रहा था, वहां से मुझे लगा कि अनुमति आईडी में वही मान होना चाहिए जो चयनित SelectListItem के मान के लिए है। मेरे लिए काम किया – Brij

उत्तर

8

ठीक है, चलो अपने उदाहरण के बारे में चर्चा करते हैं, जब PermissionId int था। देखने के लिए आपने CreateEditAccountModel प्रकार का मॉडल पोस्ट किया है। जब आपने यह मॉडल बनाया, PermissionId बराबर 0 (int का डिफ़ॉल्ट मान)। और DropDownListFor देखें इस मान को प्राप्त करें। इसलिए आपके पास कोई चयनित मूल्य नहीं था। जब आप स्ट्रिंग प्रकार का उपयोग करते हैं, तो PermissionId का डिफ़ॉल्ट मान शून्य था, इसलिए 'DropDownListFor ने SelectList का डिफ़ॉल्ट मान लिया।

इस मामले में int? या Nullable<int>PermissionId के लिए उपयोग करना बेहतर है।

+1

आपकी व्याख्या प्रासंगिक है। वैसे वापस, जब मैंने इस सवाल से पूछा तो मुझे समझ में नहीं आया कि 'DropDownListFor' पहले' PermissionId' के मान का मूल्यांकन करेगा और यदि यह शून्य नहीं है, तो यह वह मान चयनित होगा। अन्यथा यह 'मॉडल' नियमों को ध्यान में रखेगा – Dmitry

+0

यह प्रश्न के साथ करना पड़ सकता है लेकिन यह किसी के लिए उपयोगी हो सकता है जब आप कहते हैं कि सूची को linq से entities में बनाएं और int को स्ट्रिंग वैल्यू मेक में कनवर्ट करें यदि आप SqlFunctions का उपयोग कर रहे हैं तो ट्रिम करना सुनिश्चित करें। StringConvert कारण यह पूर्व निर्धारित मूल्य के लिए चयनित = सत्य प्रस्तुत नहीं करेगा। ट्रिमिंग नहीं होने से ड्रॉपडाउन का मूल्य इस तरह है: value = "1"। –

4

जब आप @Html.DropDownListFor(m => m.PermissionId, Model.Permissions) का उपयोग, कृपया सुनिश्चित करें PermissionId पहले से ही अपने मॉडल में सेट है - चयनित आइटम/आईडी है।इसके अलावा, मॉडल एक 'चयनित' विशेषता शामिल हैं:

var query = DatabaseContexts.Select(
      c => new SelectListItem 
      { 
       Value = c.Key, 
       Text = c.Value, 
       Selected = c.Key == currentUsed 
      }); 

PermissionId = that want to select; 
Permissions = query.AsEnumerable(); 

अद्यतन:

HomeController.cs में:

[HttpGet] 
public ActionResult EditAccount(int id) 
{ 
    CreateEditAccountModel model = new CreateEditAccountModel(); 

    var permissionsAll = new List<SelectListItem> 
     { 
      new SelectListItem 
       { 
        Value = "", 
        Text = "--please select--", 
        Selected = false 
       }, 
      new SelectListItem 
       { 
        Value = "1", 
        Text = "Permission one", 
        Selected = true 
       }, 
      new SelectListItem 
       { 
        Value = "2", 
        Text = "Permission two", 
        Selected = false 
       } 
     }; 
    model.PermissionId = 1; //add this line 
    model.Permissions = permissionsAll; // PermissionsAll();// -- get data from services or anywhere.... 
    return View("EditAccount", model); 
} 

यहाँ HttpGet की एक पूरी नमूना है

CreateEditAccountModel.cs:

public class CreateEditAccountModel 
{ 
    [Required] 
    [Display(Name = "Permission")] 
    public int PermissionId { get; set; } 
    public IEnumerable<SelectListItem> Permissions { get; set; } 

} 

EditAccount.cshtml:

@using MvcApplication1.Models 
@model CreateEditAccountModel 
@{ 
    ViewBag.Title = "EditAccount"; 
} 

<h2>EditAccount</h2> 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(m => m.PermissionId, Model.Permissions) 
} 

आवेदन चलाने के लिए और डिफ़ॉल्ट रूप से करने के लिए/घर/editaccount/1, लटकती "अनुमति एक" का चयन करेंगे जाओ।

मुझे लगता है कि PermissionId प्रकार 'स्ट्रिंग' है होना चाहिए, System.Web.Mvc.SelectedListItem.Value 'स्ट्रिंग'

, आप कुछ करना चाहते हैं, तो जब उपयोगकर्ता ड्रॉपडाउन सूची में आइटम का चयन किया है आप [HttpPost] की आवश्यकता हो सकती है।

बीटीडब्ल्यू: this link आपके लिए उपयोगी है?

+0

अनुमति आईडी वास्तव में सेट किया गया था। मैंने मूल रूप से मॉडल से गुणों के गलत सेट की प्रतिलिपि बनाई। कृपया फिर से समीक्षा करें। नियंत्रक में – Dmitry

+0

: CreateEditAccountModel मॉडल = नया CreateEditAccountModel(); मॉडल। अनुमतियां = अनुमतियां सभी(); मॉडल। PermissionId = 1;/* चयनित आईडी */ रिटर्न व्यू ("CreateEditAccount", मॉडल); देखें: @ एचटीएमएल.ड्रॉपडाउन लिस्टफोर (एम => एम। वर्मिशनआईडी, मॉडल। प्रामिशन); – xoyoja

+0

xoyoja, आप HttpGet पर इसका मूल्य क्यों निर्दिष्ट करेंगे? किसी भी मामले में परिवर्तनीय मान ड्रॉप डाउन सूची को प्रभावित नहीं करना चाहिए क्योंकि यह केवल एक चर है जो चयनित मान रखेगा। मैंने अभी भी कोशिश की और इससे मदद नहीं मिली। कोशिश करने के लिए धन्यवाद! – Dmitry

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