MVC SelectList het combineren van meerdere kolommen in het tekstveld

Hoe zou ik het genereren van een selecte lijst, waarbij het tekstveld, is opgebouwd uit twee of meer tekstkolommen, bijvoorbeeld: Waar heb ik een omschrijving en Rate veld in mijn database, wil ik deze te combineren om te laten zien:

Large--£200
Medium--£150
Small--£100

Controller code is:

var stands = db.Stands.Where(s => s.ExhibitorID == null).ToList();
 ViewBag.StandID = new SelectList(stands,"StandID", "Description" + "-- £" + "Rate");

… en mijn uitzicht is (momenteel):

   <div class="editor-field"> 
        @Html.DropDownList("StandID", "--Select--") 
    </div> 

… maar de “Beschrijving” + “- £” + “Rate”); kan niet worden uitgevoerd:

DataBinding:
‘System.Data.Entity.DynamicProxies.Stand_63F8C9F623B3C0E57D3008A57081AFCD9C39E1A6B79B0380B60840F1EFAE9DB4’
niet een eigenschap met de naam ‘Description– £ Rate’ bevatten.

Bedankt voor alle hulp,

Mark


Antwoord 1, Autoriteit 100%

U kan een nieuwe anonieme klas met behulp van een eenvoudige LINQ projectie maken en vervolgens gebruik maken van de SelectList(IEnumerable, string, string)constructor overload om de waarde en tekstvelden te worden gebruikt voor de <option>elementen namelijk:

var stands = 
  db.Stands
    .Where(s => s.ExhibitorID == null)
    .Select(s => new 
     { 
       StandID = s.StandID,
       Description = string.Format("{0}-- £{1}", s.Description, s.Rate) 
     })
    .ToList();
ViewBag.StandID = new SelectList(stands, "StandID", "Description")

Bewerken

In C # 6 en hoger, snaar interpolatie zorgt voor een betere lezen dan string.Format

  ...
   Description = $"{s.Description}-- £{s.Rate}"

Als je project om een ​​sterke ViewModelklasse naam (in plaats van een anonieme klasse), zult u ongetwijfeld willen de magie snaren te vervangen door de veiligheid van de nameofoperator:

ViewBag.StandID = new SelectList(stands, nameof(Stand.StandID), nameof(Stand.Description));

Antwoord 2, Autoriteit 17%

var stands = db.Stands.Where(s => s.ExhibitorID == null).ToList();
IEnumerable<SelectListItem> selectList = from s in stands
                                         select new SelectListItem
                                                    {
                                                      Value = s.StandID,
                                                      Text = s.Description + "-- £" + s.Rate.ToString()
                                                    };
ViewBag.StandID = new SelectList(selectList, "Value", "Text");

Antwoord 3, Autoriteit 8%

U kunt een gedeeltelijke Model klasse te maken

public partial class Stand
{
    public string DisplayName
    {
        get
        {
            return this.Description + "-- £" + this.Rate.ToString();
        }
    }
}

Toen in uw View

var stands = db.Stands.Where(s => s.ExhibitorID == null).ToList();
ViewBag.StandID = new SelectList(stands,"StandID", "DisplayName");

Antwoord 4, Autoriteit 4%

Het formaat van de bouwer die u gebruikt
SelectList (IEnumerable items, touwtje dataValueField, touwtje dataTextField).

Dus als je het gebruikt zoals je het hebt, zeg je eigenlijk dat het moet binden aan het TextField genaamd “Description– £Rate” en als dit niet is hoe het veld wordt genoemd dat in de DB komt, zal het niet weet wat je aangeeft.

Elk van de twee hierboven beschreven methoden zal werken zolang de waarde die u in uw dataValueField hebt, overeenkomt met de naam van de eigenschap waarin u de waarde invoert en het dataTextField overeenkomt met de eigenschapsnaam van waar u de tekst plaatst, misschien een mix van de twee bovenstaande oplossingen. (Alleen omdat ik lambda-expressies verkies boven linq.) en het gebruik van een selectlist-item voorkomt dat het een ToList op de verzameling moet doen na de transformatie. je maakt in feite de objecten die van nature aan een selecte lijst binden.

Misschien wilt u ook de beschrijving of het tarief aanvinken om er zeker van te zijn dat ze niet leeg zijn voordat u ze in de lijst plaatst

var stands = db.Stands.Where(s => s.ExhibitorID == null)
                  .Select(s => new SelectListItem
                {
                    Value = s.StandID.ToString(),
                    Text = s.Description + "-- £" + s.Rate.ToString()
                });
ViewBag.StandID = new SelectList(stands, "Value", "Text");

Antwoord 5, autoriteit 2%

Ik deed dit door mijn weergavemodel aan te passen, hier is mijn code:

Het kijkmodel

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MvcEsosNew.Models;
using System.Web.Mvc;
namespace MvcEsosNew.ViewModels
{
    public class EntitlementViewModel
    {
        public int EntitlementCount { get; set; }
        public Entitlement Entitlement { get; set; }
        public SelectList Member { get; set; }
        public SelectList Job_Grade { get; set; }
        public SelectList Department { get; set; }
        public SelectList Esos_Batch { get; set; }
    }
    public class department_FullName
    {
        public int deptID { get; set; }
        public string deptCode { get; set; }
        public string deptName { get; set; }
        public string fullName { get { return deptCode + " - " + deptName; } }
    }
}

De controller

public void getAllDepartment(EntitlementViewModel entitlementVM)
        {
            var department = from Department in db.Departments.Where(D => D.Status == "ACTIVE").ToList()
                             select new department_FullName
                             {
                                 deptID   = Department.id,
                                 deptCode = Department.department_code,
                                 deptName = Department.department_name
                             };
            entitlementVM.Department = new SelectList(department, "deptID", "fullName");
        }

Het Uitzicht

    <div class="form-group row">
                <div class="col-sm-2">
                    @Html.LabelFor(model => model.Entitlement.department_id)
                </div>
                <div class="col-sm-10">
                     @Html.DropDownListFor(model => model.Entitlement.department_id, Model.Department, new { @class="form-control" })
                     @Html.ValidationMessageFor(model => model.Entitlement.department_id)
                </div>
            </div>

Het resultaat:

Other episodes