2016-05-24 51 views
6

C# ve .NET Framework 4.6.1 ile bir ASP.NET MVC 5 uygulaması geliştiriyorum.MVC5 Razor html.dropdownlist değeri değer dizisinde olduğunda seçili olan set

@model MyProject.Web.API.Models.AggregationLevelConfViewModel 

[...] 

@Html.DropDownListFor(m => m.Configurations[0].HelperCodeType, (SelectList)Model.HelperCodeTypeItems, new { id = "Configurations[0].HelperCodeType" }) 

ViewModel geçerli::

public class AggregationLevelConfViewModel 
{ 
    private readonly List<GenericIdNameType> codeTypes; 
    private readonly List<GenericIdNameType> helperCodeTypes; 

    public IEnumerable<SelectListItem> CodeTypeItems 
    { 
     get { return new SelectList(codeTypes, "Id", "Name"); } 
    } 

    public IEnumerable<SelectListItem> HelperCodeTypeItems 
    { 
     get { return new SelectList(helperCodeTypes, "Id", "Name"); } 
    } 

    public int ProductionOrderId { get; set; } 

    public string ProductionOrderName { get; set; } 

    public IList<Models.AggregationLevelConfiguration> Configurations { get; set; } 

    public AggregationLevelConfViewModel() 
    { 
     // Load CodeTypes to show it as a DropDownList 
     byte[] values = (byte[])Enum.GetValues(typeof(CodeTypes)); 

     codeTypes = new List<GenericIdNameType>(); 
     helperCodeTypes = new List<GenericIdNameType>(); 

     for (int i = 0; i < values.Length; i++) 
     { 
      GenericIdNameType cType = new GenericIdNameType() 
      { 
       Id = values[i].ToString(), 
       Name = EnumHelper.GetDescription((CodeTypes)values[i]) 
      }; 

      if (((CodeTypes)values[i]) != CodeTypes.NotUsed) 
       codeTypes.Add(cType); 

      helperCodeTypes.Add(cType); 
     } 
    } 
} 

Ve Models.AggregationLevelConfiguration geçerli:

public class AggregationLevelConfiguration 
{ 
    public byte AggregationLevelConfigurationId { get; set; } 
    public int ProductionOrderId { get; set; } 
    public string Name { get; set; } 
    public byte CodeType { get; set; } 
    public byte HelperCodeType { get; set; } 
    public int PkgRatio { get; set; } 
    public int RemainingCodes { get; set; } 
} 

Ben bu özelliklerin seçilen değeri ayarlamanız gerekir:

Bu View var

alanlar AggregationLevelConfiguration.CodeType ve AggregationLevelConfiguration.HelperCodeType: Seçilen değer Configurations dizi olduğu için
public IEnumerable<SelectListItem> CodeTypeItems 
{ 
    get { return new SelectList(codeTypes, "Id", "Name"); } 
} 

public IEnumerable<SelectListItem> HelperCodeTypeItems 
{ 
    get { return new SelectList(helperCodeTypes, "Id", "Name"); } 
} 

Ama new SelectList(codeTypes, "Id", "Name"); veya new SelectList(helperCodeTypes, "Id", "Name"); bunu ayarlanamaz.

Ben görünümünde seçilen değere ayarlamak zorunda düşünüyorum, ama bunu nasıl bilmiyorum.

Seçilen değerleri nasıl ayarlayabilirim? Bir döngü içinde denetimleri işlerken

+0

Onun kullanılarak talihsiz bir sınırlama 'DropDownListFor() 'o. Her yinelemede yeni bir 'MutliSelectList 'oluşturmalısınız (kurucuda' selectedValues' özelliğini ayarlayarak) veya (daha iyi), 'AgregationLevelConfiguration' türünün bir' EditorTemplate'ını kullanın ve 'SelectList’i şablon olarak' EkViewData' –

+0

Teşekkürler.Bir şeyleri kullanmam gerektiğini anladım ama onları nasıl kullanacağımı bilmiyorum. – VansFannel

+0

6 ay önce verdiğim bir cevabı bulmaya çalışıyorum. Eğer bulamıyorsam, bir saat içinde bir cevap ekleyeceğim - ama aşağıdakiler işe yarar - '@ Html.DropDownListFor (m => m.Configurations [0] .HelperCodeType, yeni SelectList (Model.HelperCodeTypeItems,") Değer "," Metin ", Model.Configurations [0] .HelperCodeType, yeni {...})' –

cevap

12

Maalesef @Html.DropDownListFor() diğer yardımcıları göre farklı şekilde davranır. Bu daha önce (bir hata ya da sadece bir sınırlama eğer onun emin değilim)

doğru seçeneği sağlamak için bu çözmek için 2 seçenek modeli özelliğine bağlı olarak seçilir Codeplex bir konu olarak bildirilmiştir

koleksiyonunda türü için özel bir EditorTemplate oluşturun (bir EditorTemplate kullanarak) Seçenek 1. (

@model yourAssembly.AggregationLevelConfiguration 
@Html.DropDownListFor(m => m.HelperCodeType, (SelectList)ViewData["CodeTypeItems"]) 
.... // other properties of AggregationLevelConfiguration 

ve daha sonra ana görünümde, SelectListEditorTemplate

@using (Html.BeginForm()) 
{ 
    ... 
    @Html.EditorFor(m => m.Configurations , new { CodeTypeItems = Model.CodeTypeItems }) 
    ... 

additionalViewData olarak Seçenek 2 geçirmek türünün adını eşleşmelidir adı not (/Views/Shared/EditorTemplates/AggregationLevelConfiguration.cshtml kısmi oluşturma Her bir yinelemede yeni bir SelectList oluşturun ve selectedValue

Bu seçenekte mülkünüz CodeTypeItems, SelectList değil, IEnumerable<GenericIdNameType> olmalıdır (veya yalnızca codeTypes genel özellikte bir mülk edinmelidir). Daha sonra ana görünümünde

@Html.DropDownListFor(m => m.Configurations[0].HelperCodeType, new SelectList(Model.CodeTypeItems, "Id", "Name", Model.Configurations[0].HelperCodeType) 

yan not in: new { id = "Configurations[0].HelperCodeType" kullanmaya gerek yoktur - DropDownListFor() yöntem zaten oluşturulmuş bir döngüde id özelliği

+0

Seçenek 2 ile günümü kurtardınız! Daha önce, tüm DropDownList'leri boyunca yinelemek ve seçili değer manuallını ayarlamak için hacky JavaScript döngüsü kullandım Gizli alanlardan y. – BergListe