Подтвердить что ты не робот

MVC SelectList, объединяющий несколько столбцов в текстовом поле

Как мне сгенерировать список выбора, где текстовое поле состоит из двух или более текстовых столбцов, например: где у меня есть поле "Описание и скорость" в моей базе данных, я хочу объединить их, чтобы показать:

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

Код контроллера:

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

... и мое представление (в настоящее время):

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

... но "Описание" + "- £" + "Rate" ); не будет выполняться:

DataBinding: 'System.Data.Entity.DynamicProxies.Stand_63F8C9F623B3C0E57D3008A57081AFCD9C39E1A6B79B0380B60840F1EFAE9DB4' не содержит свойства с именем "Описание-- £ Rate".

Спасибо за любую помощь,

Марк

4b9b3361

Ответ 1

Вы можете создать новый анонимный класс, используя простую проекцию LINQ, а затем использовать конструкцию SelectList(IEnumerable, string, string) , чтобы указать значение и текст поля, которые будут использоваться для элементов <option>, т.е.:

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")

Изменить

В С# 6 и более поздних версиях строка-интерполяция обеспечивает лучшее чтение, чем string.Format

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

Если вы проецируете сильное имя класса ViewModel (вместо анонимного класса), вы, несомненно, захотите заменить магические строки безопасностью nameof:

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

Ответ 2

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");

Ответ 3

Формат используемого конструктора SelectList (элементы IEnumerable, строка dataValueField, строка dataTextField).

Поэтому, когда вы используете его так, как вы это делаете, вы на самом деле говорите ему, чтобы он привязывался к TextField, называемому "Описание-- £ Rate", и если это не то, что называется полем, поступающим из БД, оно не будет знайте, что вы указываете.

Любой из двух описанных выше методов будет работать до тех пор, пока значение, которое у вас есть в вашем файле dataValueField, совпадает с именем свойства, в которое вы помещаете значение, а dataTextField соответствует имени свойства, в котором вы помещаете текст, возможно, двух вышеупомянутых решений. (Только потому, что я предпочитаю лямбда-выражения над linq.) И использование элемента selectlist не позволяет ему делать ToList в коллекции после преобразования. вы на самом деле создаете объекты, которые естественно привязаны к списку выбора.

Вы также можете захотеть установить проверки описания или курса, чтобы убедиться, что они не пусты, прежде чем помещать их в список

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");

Ответ 4

Вы можете создать частичный класс Model

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

}

Затем в вашем представлении

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

Ответ 5

Я сделал это, изменив мою модель просмотра, вот мой код:

Модель просмотра

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; } }
    }
}

Контроллер

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");
        }

Вид

     <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>

Результат:

Результат