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 ViewModel
klasse naam (in plaats van een anonieme klasse), zult u ongetwijfeld willen de magie snaren te vervangen door de veiligheid van de nameof
operator:
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: