programing

텍스트 필드에서 여러 열을 결합하는 MVC 선택 목록

oldcodes 2023. 6. 18. 16:17
반응형

텍스트 필드에서 여러 열을 결합하는 MVC 선택 목록

텍스트 필드가 두 개 이상의 텍스트 열로 구성된 선택 목록을 생성하는 방법은 무엇입니까? 예: 데이터베이스에 설명 및 비율 필드가 있는 경우, 이를 결합하여 다음을 표시합니다.

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> 

...하지만 "설명" + "--파운드" + "요금";이(가) 실행되지 않습니다.

데이터 바인딩: '시스템'.데이터. 엔티티.동적 프록시.스탠드_63F8C9F623B3C0E57D3008A57081AFCD9C39E1A6B79B0380B60840F1EFAE9DB4'에 'Description--£Rate' 이름의 속성이 없습니다.

도움을 주셔서 감사합니다.

마크.

간단한 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")

편집

C#6 이상에서 문자열 보간은 다음보다 더 나은 읽기를 만듭니다.string.Format

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

만약 당신이 강한 사람에게 투사됩니다.ViewModel클래스 이름(익명 클래스 대신)은 의심할 여지 없이 마법 문자열을 운영자의 안전으로 교체하고 싶을 것입니다.

ViewBag.StandID = new SelectList(stands, nameof(Stand.StandID), nameof(Stand.Description));
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");

부분 모형 클래스를 만들 수 있습니다.

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

사용 중인 생성자의 형식은 SelectList(IEnumberable 항목, string dataValueField, string dataTextField)입니다.

따라서 현재의 방식으로 사용할 경우 실제로 "Description -- £Rate"라는 TextField에 바인딩하도록 지시합니다. 이 필드의 이름이 DB에서 들어오는 것이 아니라면 사용자가 무엇을 의미하는지 알 수 없습니다.

위에서 설명한 두 가지 방법 중 하나는 사용자가 dataValueField에 입력한 값이 Value에 입력한 속성의 이름과 일치하고 dataTextField가 텍스트를 입력한 위치의 속성 이름과 일치하는 한 작동합니다. 아마도 위의 두 솔루션이 혼합된 것입니다. (단, linq보다 람다 식을 선호하기 때문입니다.)선택 목록 항목을 사용하면 변환 후 컬렉션에서 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");

View Model을 수정하여 이 작업을 수행했습니다. 코드는 다음과 같습니다.

뷰 모델

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>

결과:

The Result

언급URL : https://stackoverflow.com/questions/12727285/mvc-selectlist-combining-multiple-columns-in-text-field

반응형