ASP.NET Core MVC में टैग हेल्पर का चयन करें


162

मुझे ASP.NET कोर में सेलेक्ट टैग हेल्पर की कुछ मदद चाहिए।

मेरे पास कर्मचारियों की एक सूची है जो मैं एक चुनिंदा टैग सहायक को बांधने की कोशिश कर रहा हूं। मेरे कर्मचारी एक में हैं List<Employee> EmployeesListऔर चयनित मूल्य EmployeeIdसंपत्ति में जाएगा । मेरा दृश्य मॉडल इस तरह दिखता है:

public class MyViewModel
{
   public int EmployeeId { get; set; }
   public string Comments { get; set; }
   public List<Employee> EmployeesList {get; set; }
}

मेरा कर्मचारी वर्ग ऐसा दिखता है:

public class Employee
{
   public int Id { get; set; }
   public string FullName { get; set; }
}

मेरा सवाल यह है कि ड्रॉप डाउन सूची में Idप्रदर्शित करते समय मैं अपने चुनिंदा टैग सहायक का उपयोग मूल्य के रूप में कैसे करूं FullName?

<select asp-for="EmployeeId" asp-items="???" />

मैं इस के साथ कुछ मदद की सराहना करेंगे। धन्यवाद।


3
बस कुछ मैंने सोचा कि मुझे जोड़ना चाहिए, यदि आप चुनिंदा टैग को हमेशा बंद नहीं करते हैं तो यह काम नहीं करता है हमेशा टैग के साथ बंद करें </ select> टैग सहायक ने <select asp-for ..... /> के साथ काम नहीं किया
RoughPlace

बस एक टिप। मचान नियंत्रक आम तौर पर आपको ऐसी चीजों के लिए सबसे अच्छे तरीके दिखाते हैं
नेविल नाजरीन

जवाबों:


379

चयन तत्व का चयन करने के लिए टैग हेल्पर्स का उपयोग करना

अपने GET एक्शन में, अपने व्यू मॉडल का एक ऑब्जेक्ट बनाएं, EmployeeListकलेक्शन प्रॉपर्टी को लोड करें और उसे व्यू में भेजें।

public IActionResult Create()
{
    var vm = new MyViewModel();
    vm.EmployeesList = new List<Employee>
    {
        new Employee { Id = 1, FullName = "Shyju" },
        new Employee { Id = 2, FullName = "Bryan" }
    };
    return View(vm);
}

और अपने दृश्य में, संपत्ति SelectListसे एक नई वस्तु बनाएं EmployeeListऔर उस संपत्ति के मूल्य के रूप में पास करें asp-items

@model MyViewModel
<form asp-controller="Home" asp-action="Create">

    <select asp-for="EmployeeId" 
            asp-items="@(new SelectList(Model.EmployeesList,"Id","FullName"))">
        <option>Please select one</option>
    </select>

    <input type="submit"/>

</form>

और सबमिट किए गए फॉर्म डेटा को स्वीकार करने के लिए आपका HttpPost एक्शन विधि।

[HttpPost]
public IActionResult Create(MyViewModel model)
{
   //  check model.EmployeeId 
   //  to do : Save and redirect
}

या

यदि आपके दृश्य मॉडल में List<SelectListItem>आपके ड्रॉपडाउन आइटम के लिए संपत्ति है।

public class MyViewModel
{
    public int EmployeeId { get; set; }
    public string Comments { get; set; }
    public List<SelectListItem> Employees { set; get; }
}

और अपने कार्रवाई में,

public IActionResult Create()
{
    var vm = new MyViewModel();
    vm.Employees = new List<SelectListItem>
    {
        new SelectListItem {Text = "Shyju", Value = "1"},
        new SelectListItem {Text = "Sean", Value = "2"}
    };
    return View(vm);
}

और देखने में, आप सीधे Employeesसंपत्ति का उपयोग कर सकते हैं asp-items

@model MyViewModel
<form asp-controller="Home" asp-action="Create">

    <label>Comments</label>
    <input type="text" asp-for="Comments"/>

    <label>Lucky Employee</label>
    <select asp-for="EmployeeId" asp-items="@Model.Employees" >
        <option>Please select one</option>
    </select>

    <input type="submit"/>

</form>

वर्ग SelectListItemके अंतर्गत आता है Microsoft.AspNet.Mvc.Renderingनाम स्थान।

सुनिश्चित करें कि आप चयन तत्व के लिए एक स्पष्ट समापन टैग का उपयोग कर रहे हैं। यदि आप स्वयं समापन टैग दृष्टिकोण का उपयोग करते हैं, तो टैग सहायक एक खाली चयन तत्व प्रदान करेगा!

नीचे का दृष्टिकोण काम नहीं करेगा

<select asp-for="EmployeeId" asp-items="@Model.Employees" />

लेकिन यह काम करेगा।

<select asp-for="EmployeeId" asp-items="@Model.Employees"></select>

इकाई ढांचे का उपयोग करके अपने डेटाबेस तालिका से डेटा प्राप्त करना

उपरोक्त उदाहरण विकल्पों के लिए हार्ड कोडित वस्तुओं का उपयोग कर रहे हैं। इसलिए मैंने सोचा कि मैं कुछ नमूना कोड जोड़ूंगा ताकि इकाई ढांचे का उपयोग करके डेटा प्राप्त किया जा सके क्योंकि बहुत सारे लोग इसका उपयोग करते हैं।

चलो अपने DbContext वस्तु एक संपत्ति कहा जाता है मान लेते हैं Employees, इस प्रकार का है जो DbSet<Employee>जहां Employeeइकाई वर्ग एक है Idऔर Nameइस तरह की संपत्ति

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

आप कर्मचारियों को प्राप्त करने के लिए एक LINQ क्वेरी का उपयोग कर सकते हैं और SelectListItemप्रत्येक कर्मचारी के लिए वस्तुओं की सूची बनाने के लिए अपनी LINQ अभिव्यक्ति में चयन विधि का उपयोग कर सकते हैं ।

public IActionResult Create()
{
    var vm = new MyViewModel();
    vm.Employees = context.Employees
                          .Select(a => new SelectListItem() {  
                              Value = a.Id.ToString(),
                              Text = a.Name
                          })
                          .ToList();
    return View(vm);
}

मान contextलेना आपकी db संदर्भ वस्तु है। देखने का कोड ऊपर जैसा है।

SelectList का उपयोग करना

कुछ लोग SelectListविकल्पों को प्रस्तुत करने के लिए आवश्यक वस्तुओं को रखने के लिए वर्ग का उपयोग करना पसंद करते हैं।

public class MyViewModel
{
    public int EmployeeId { get; set; }
    public SelectList Employees { set; get; }
}

अब आपकी GET कार्रवाई में, आप व्यू मॉडल SelectListकी Employeesसंपत्ति को पॉप्युलेट करने के लिए कंस्ट्रक्टर का उपयोग कर सकते हैं । सुनिश्चित करें कि आप dataValueFieldऔर dataTextFieldमापदंडों को निर्दिष्ट कर रहे हैं ।

public IActionResult Create()
{
    var vm = new MyViewModel();
    vm.Employees = new SelectList(GetEmployees(),"Id","FirstName");
    return View(vm);
}
public IEnumerable<Employee> GetEmployees()
{
    // hard coded list for demo. 
    // You may replace with real data from database to create Employee objects
    return new List<Employee>
    {
        new Employee { Id = 1, FirstName = "Shyju" },
        new Employee { Id = 2, FirstName = "Bryan" }
    };
}

यहाँ मैं बोल रहा हूँ GetEmployeesविधि, एक के साथ एक कर्मचारी वस्तुओं की एक सूची प्राप्त करने के लिए Idऔर FirstNameसंपत्ति और मैं के रूप में उन गुणों का उपयोग DataValueFieldऔर DataTextFieldकी SelectListवस्तु हम बनाया। आप हार्डकोड सूची को एक कोड में बदल सकते हैं जो डेटाबेस तालिका से डेटा पढ़ता है।

व्यू कोड समान होगा।

<select asp-for="EmployeeId" asp-items="@Model.Employees" >
    <option>Please select one</option>
</select>

तार की सूची से एक चयन तत्व का प्रतिपादन करें।

कभी-कभी आप स्ट्रिंग्स की एक सूची से एक चुनिंदा तत्व को प्रस्तुत करना चाह सकते हैं। उस स्थिति में, आप SelectListकंस्ट्रक्टर का उपयोग कर सकते हैं जो केवल लेता हैIEnumerable<T>

var vm = new MyViewModel();
var items = new List<string> {"Monday", "Tuesday", "Wednesday"};
vm.Employees = new SelectList(items);
return View(vm);

व्यू कोड समान होगा।

चयनित विकल्प सेट करना

कुछ बार, आप एक विकल्प को सेलेक्ट एलिमेंट में डिफ़ॉल्ट विकल्प के रूप में सेट करना चाहते हैं (उदाहरण के लिए, एक एडिट स्क्रीन में, आप पहले से सेव किए गए ऑप्शन वैल्यू को लोड करना चाहते हैं)। ऐसा करने के लिए, आप केवल उस EmployeeIdसंपत्ति के मूल्य को उस विकल्प के मूल्य पर सेट कर सकते हैं जिस विकल्प को आप चुनना चाहते हैं।

public IActionResult Create()
{
    var vm = new MyViewModel();
    vm.Employees = new List<SelectListItem>
    {
        new SelectListItem {Text = "Shyju", Value = "11"},
        new SelectListItem {Text = "Tom", Value = "12"},
        new SelectListItem {Text = "Jerry", Value = "13"}
    };
    vm.EmployeeId = 12;  // Here you set the value
    return View(vm);
}

जब पृष्ठ प्रदान किया जाता है तो यह विकल्प तत्व में विकल्प टॉम का चयन करेगा।

बहु चयन ड्रॉपडाउन

यदि आप एक बहु चयन ड्रॉपडाउन प्रस्तुत करना चाहते हैं, तो आप अपनी व्यू मॉडल प्रॉपर्टी को बदल सकते हैं, जिसे आप asp-forअपने व्यू में एट्रिब्यूट टाइप के लिए प्रयोग करते हैं।

public class MyViewModel
{
    public int[] EmployeeIds { get; set; }
    public List<SelectListItem> Employees { set; get; }
}

यह multipleगुण के साथ चयनित तत्व के लिए HTML मार्कअप को प्रस्तुत करेगा जो उपयोगकर्ता को कई विकल्पों का चयन करने की अनुमति देगा।

@model MyViewModel
<select id="EmployeeIds" multiple="multiple" name="EmployeeIds">
    <option>Please select one</option>
    <option value="1">Shyju</option>
    <option value="2">Sean</option>
</select>

बहु चयन में चयनित विकल्प सेट करना

एकल चयन के समान, EmployeeIdsसंपत्ति मान को आपके इच्छित मानों के एक समूह में सेट करें ।

public IActionResult Create()
{
    var vm = new MyViewModel();
    vm.Employees = new List<SelectListItem>
    {
        new SelectListItem {Text = "Shyju", Value = "11"},
        new SelectListItem {Text = "Tom", Value = "12"},
        new SelectListItem {Text = "Jerry", Value = "13"}
    };
    vm.EmployeeIds= new int[] { 12,13} ;  
    return View(vm);
}

जब पृष्ठ प्रदान किया जाता है तो यह मल्टी सेलेक्ट एलिमेंट में टॉम एंड जेरी विकल्प का चयन करेगा।

आइटम की सूची को स्थानांतरित करने के लिए ViewBag का उपयोग करना

यदि आप विकल्पों की सूची को पास करने के लिए संग्रह प्रकार की संपत्ति रखना पसंद नहीं करते हैं, तो आप ऐसा करने के लिए गतिशील ViewB का उपयोग कर सकते हैं। ( यह मेरा व्यक्तिगत रूप से अनुशंसित दृष्टिकोण नहीं है क्योंकि व्यूबैग गतिशील है और आपका कोड अनियंत्रित है। टाइपो त्रुटियां )

public IActionResult Create()
{       
    ViewBag.Employees = new List<SelectListItem>
    {
        new SelectListItem {Text = "Shyju", Value = "1"},
        new SelectListItem {Text = "Sean", Value = "2"}
    };
    return View(new MyViewModel());
}

और देखने में

<select asp-for="EmployeeId" asp-items="@ViewBag.Employees">
    <option>Please select one</option>
</select>

आइटमों की सूची और चयनित विकल्प सेट करने के लिए ViewBag का उपयोग करना

यह ऊपर जैसा है। आपको बस इतना करना है कि आप जिस विकल्प को चुनना चाहते हैं उसके मूल्य के लिए संपत्ति (जिसके लिए आप ड्रॉपडाउन को बाध्य कर रहे हैं) सेट करें।

public IActionResult Create()
{       
    ViewBag.Employees = new List<SelectListItem>
    {
        new SelectListItem {Text = "Shyju", Value = "1"},
        new SelectListItem {Text = "Bryan", Value = "2"},
        new SelectListItem {Text = "Sean", Value = "3"}
    };

    vm.EmployeeId = 2;  // This will set Bryan as selected

    return View(new MyViewModel());
}

और देखने में

<select asp-for="EmployeeId" asp-items="@ViewBag.Employees">
    <option>Please select one</option>
</select>

आइटम समूहीकरण

चयन टैग सहायक विधि एक ड्रॉपडाउन में समूहीकरण विकल्पों का समर्थन करती है। आपको बस इतना करना है कि अपनी कार्य विधि में Groupप्रत्येक के संपत्ति मूल्य को निर्दिष्ट करें SelectListItem

public IActionResult Create()
{
    var vm = new MyViewModel();

    var group1 = new SelectListGroup { Name = "Dev Team" };
    var group2 = new SelectListGroup { Name = "QA Team" };

    var employeeList = new List<SelectListItem>()
    {
        new SelectListItem() { Value = "1", Text = "Shyju", Group = group1 },
        new SelectListItem() { Value = "2", Text = "Bryan", Group = group1 },
        new SelectListItem() { Value = "3", Text = "Kevin", Group = group2 },
        new SelectListItem() { Value = "4", Text = "Alex", Group = group2 }
    };
    vm.Employees = employeeList;
    return View(vm);
}

व्यू कोड में कोई बदलाव नहीं हुआ है। चुनिंदा टैग हेल्पर अब 2 ऑप्टग्रुप आइटम के अंदर विकल्पों को प्रस्तुत करेगा ।


1
धन्यवाद! पुराने रेजर सिंटैक्स की तरह, जहां हमें SelectList में रूपांतरण करने की आवश्यकता होती है। एक बार फिर धन्यवाद।
सैम

7
मैं एक खाली विकल्प जोड़ने के लिए देख रहा था, उपयोग करने के लिए धन्यवाद<option>Please select one</option>
सर्ज सगन

5
ध्यान दें कि आपके पास एक बंद होना चाहिए </ select> टैग - यदि आप <select ...> जैसे चयनित टैग को स्वयं बंद करने का प्रयास करते हैं तो यह काम नहीं करेगा। इसके अलावा, यदि आप "कृपया एक का चयन करें" जैसे खाली विकल्प का उपयोग करते हैं, तो आपको काम करने के लिए आवश्यक क्षेत्र सत्यापन के लिए इसे "खाली स्ट्रिंग का मूल्य" देने की आवश्यकता है।
एंडी

3
"सुनिश्चित करें कि आप चयनित तत्व के लिए एक स्पष्ट समापन टैग का उपयोग कर रहे हैं। यदि आप स्वयं समापन टैग दृष्टिकोण का उपयोग करते हैं, तो टैग सहायक एक खाली चयन तत्व को प्रस्तुत करेगा!" मेरे मामले में यह मुद्दा था। चीयर्स!
मारियस

2
इस उत्तर में इतना प्रयास करने के लिए धन्यवाद!
विदर्भ

11

मैंने इसके लिए एक इंटरफ़ेस और एक <options>टैग सहायक बनाया । इसलिए मुझे नियंत्रण को आबाद करने के लिए हर बार IEnumerable<T>वस्तुओं को परिवर्तित नहीं IEnumerable<SelectListItem>करना पड़ा <select>

और मुझे लगता है कि यह खूबसूरती से काम करता है ...

उपयोग कुछ इस प्रकार है:

<select asp-for="EmployeeId">
    <option value="">Please select...</option>
    <options asp-items="@Model.EmployeesList" />
</select>

और यह टैग सहायक के साथ काम करने के लिए आपको उस इंटरफ़ेस को अपनी कक्षा में लागू करना होगा:

public class Employee : IIntegerListItem
{
   public int Id { get; set; }
   public string FullName { get; set; }

   public int Value { return Id; }
   public string Text{ return FullName ; }
}

ये आवश्यक कोड हैं:

अंतरपटल:

public interface IIntegerListItem
{
    int Value { get; }
    string Text { get; }
}

<options>टैग सहायक:

[HtmlTargetElement("options", Attributes = "asp-items")]
public class OptionsTagHelper : TagHelper
{
    public OptionsTagHelper(IHtmlGenerator generator)
    {
        Generator = generator;
    }

    [HtmlAttributeNotBound]
    public IHtmlGenerator Generator { get; set; }

    [HtmlAttributeName("asp-items")]
    public object Items { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.SuppressOutput();
        // Is this <options /> element a child of a <select/> element the SelectTagHelper targeted?
        object formDataEntry;
        context.Items.TryGetValue(typeof(SelectTagHelper), out formDataEntry);

        var selectedValues = formDataEntry as ICollection<string>;
        var encodedValues = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
        if (selectedValues != null && selectedValues.Count != 0)
        {
            foreach (var selectedValue in selectedValues)
            {
                encodedValues.Add(Generator.Encode(selectedValue));
            }
        }

        IEnumerable<SelectListItem> items = null;
        if (Items != null)
        {
            if (Items is IEnumerable)
            {
                var enumerable = Items as IEnumerable;
                if (Items is IEnumerable<SelectListItem>)
                    items = Items as IEnumerable<SelectListItem>;
                else if (Items is IEnumerable<IIntegerListItem>)
                    items = ((IEnumerable<IIntegerListItem>)Items).Select(x => new SelectListItem() { Selected = false, Value = ((IIntegerListItem)x).Value.ToString(), Text = ((IIntegerListItem)x).Text });
                else
                    throw new InvalidOperationException(string.Format("The {2} was unable to provide metadata about '{1}' expression value '{3}' for <options>.",
                        "<options>",
                        "ForAttributeName",
                        nameof(IModelMetadataProvider),
                        "For.Name"));
            }
            else
            {
                throw new InvalidOperationException("Invalid items for <options>");
            }

            foreach (var item in items)
            {
                bool selected = (selectedValues != null && selectedValues.Contains(item.Value)) || encodedValues.Contains(item.Value);
                var selectedAttr = selected ? "selected='selected'" : "";

                if (item.Value != null)
                    output.Content.AppendHtml($"<option value='{item.Value}' {selectedAttr}>{item.Text}</option>");
                else
                    output.Content.AppendHtml($"<option>{item.Text}</option>");
            }
        }
    }
}

कुछ टाइपो हो सकता है लेकिन उद्देश्य स्पष्ट है मुझे लगता है। मुझे थोड़ा एडिट करना पड़ा।


4

आप IHtmlHelper.GetEnumSelectList का भी उपयोग कर सकते हैं

    // Summary:
    //     Returns a select list for the given TEnum.
    //
    // Type parameters:
    //   TEnum:
    //     Type to generate a select list for.
    //
    // Returns:
    //     An System.Collections.Generic.IEnumerable`1 containing the select list for the
    //     given TEnum.
    //
    // Exceptions:
    //   T:System.ArgumentException:
    //     Thrown if TEnum is not an System.Enum or if it has a System.FlagsAttribute.
    IEnumerable<SelectListItem> GetEnumSelectList<TEnum>() where TEnum : struct;

4

नीचे दिए गए मेरे जवाब से सवाल हल नहीं होता है लेकिन यह संबंधित है।

यदि कोई enumक्लास मॉडल के बजाय उपयोग कर रहा है , तो इस उदाहरण की तरह:

public enum Counter
{
    [Display(Name = "Number 1")]
    No1 = 1,
    [Display(Name = "Number 2")]
    No2 = 2,
    [Display(Name = "Number 3")]
    No3 = 3
}

और जब जमा करने के लिए मूल्य प्राप्त करने के लिए एक संपत्ति:

public int No { get; set; }

रेजर पेज में, आप Html.GetEnumSelectList<Counter>()एनम गुण प्राप्त करने के लिए उपयोग कर सकते हैं ।

<select asp-for="No" asp-items="@Html.GetEnumSelectList<Counter>()"></select>

यह निम्नलिखित HTML उत्पन्न करता है:

<select id="No" name="No">
    <option value="1">Number 1</option>
    <option value="2">Number 2</option>
    <option value="3">Number 3</option>
</select>

3

आप कई चयन के लिए नीचे दिए गए कोड का उपयोग कर सकते हैं :

<select asp-for="EmployeeId"  multiple="multiple" asp-items="@ViewBag.Employees">
    <option>Please select</option>
</select>

आप भी उपयोग कर सकते हैं:

<select id="EmployeeId" name="EmployeeId"  multiple="multiple" asp-items="@ViewBag.Employees">
    <option>Please select</option>
</select>

0

प्राप्त करें:

public IActionResult Create()
{
    ViewData["Tags"] = new SelectList(_context.Tags, "Id", "Name");
    return View();
}

पोस्ट में:

var selectedIds= Request.Form["Tags"];

दृश्य में :

<label>Tags</label>
<select  asp-for="Tags"  id="Tags" name="Tags" class="form-control" asp-items="ViewBag.Tags" multiple></select>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.