2016-05-24 17 views
6

C#と.NET Framework 4.6.1を使用してASP.NET MVC 5アプリケーションを開発しています。MVC5値が配列のときにhazard html.dropdownlistが選択されています

@model MyProject.Web.API.Models.AggregationLevelConfViewModel 

[...] 

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

ViewModelは次のとおりです:

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

そしてModels.AggregationLevelConfigurationです:

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

が、私はこれらのプロパティで選択した値を設定する必要があります。

私はこの Viewが持っている

フィールド AggregationLevelConfiguration.CodeTypeAggregationLevelConfiguration.HelperCodeType:選択した値が Configurations配列であるため
public IEnumerable<SelectListItem> CodeTypeItems 
{ 
    get { return new SelectList(codeTypes, "Id", "Name"); } 
} 

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

しかし、私はnew SelectList(codeTypes, "Id", "Name");またはnew SelectList(helperCodeTypes, "Id", "Name");でそれを設定することはできません。

ビューで選択した値を設定する必要があると思いますが、その方法はわかりません。

選択した値を設定するにはどうすればよいですか?

+0

その使用の不幸な制限 'DropDownListFor() 'という。それぞれの反復で新しいMutliSelectListを生成する必要があります(コンストラクタの 'selectedValues'プロパティを設定する)か、'(AggregationLevelConfiguration'の型に 'EditorTemplate'を使用し、' SelectList'を ' AdditionalViewData' –

+0

ありがとうございました。私は物事を使わなければならないと理解していましたが、私はそれらをどのように使うべきか分かりません。 – VansFannel

+0

私は約6ヶ月前に両方のオプションのコードを使って答えを見つけようとしていますが、運が足りません。見つけられない場合は、1時間ほどで回答を追加しますが、次のように動作します - '@Html.DropDownListFor(m => m.Configurations [0] .HelperCodeType、new SelectList(Model.HelperCodeTypeItems、 –

答えて

12

残念なことに、@Html.DropDownListFor()は、ループ内でコントロールをレンダリングするとき、他のヘルパーとは少し異なる動作をします。これ以前のCodePlex上の問題として報告されている(そのバグあるいは単に制限場合はわからない)

ザ・が正しいオプションはモデルプロパティ

に基づいて選択されていることを確認するために、これを解決するために2オプションですオプション1EditorTemplateを使用)

コレクションのタイプにカスタムEditorTemplateを作成します。 (

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

と、メインビューで、SelectListEditorTemplate

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

additionalViewDataとしてオプション2に渡すタイプの名前と一致しなければならない名前を注意(/Views/Shared/EditorTemplates/AggregationLevelConfiguration.cshtmlにおける部分を作成します各繰り返しで新しいSelectListを生成し、selectedValueを設定してください)

このオプションでは、お客様のプロパティCodeTypeItemsSelectListではなく、IEnumerable<GenericIdNameType>である必要があります(または、codeTypesを公的財産にする)。メインビュー

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

サイドノートで:new { id = "Configurations[0].HelperCodeType"を使用する必要がない - DropDownListFor()方法は、既に生成されたループ内id属性

+0

以前は、ハッキーなJavaScriptループを使用して、すべてのDropDownListsを繰り返し処理し、選択した値を設定しました隠しフィールドからy。 – BergListe

関連する問題