1

EditorForModel()を使用するとDropDownListsとして表示されるように、使用している列挙型に対していくつかのEditorTemplatesを作成しました。しかし、リストから項目を選択してフォームを送信すると、選択した項目の代わりに常に最初の項目がドロップダウンに表示されます。私が持っている場合列挙型DropDownListは常にリストの最初の値を返します

は例えば、列挙型は「サイズ」と呼ばれ、それが値「小」「中」、および「大」を持っています。 EditorForModelは、「小」,「中」,「大」の順に表示するドロップダウンを作成します。 「大きい」を選択し、データベースに作成されたモデルエントリの詳細を確認すると、「小」となります。ここで

は、私が持っているもののいくつかのサンプルコードです:

Sizes.cshtml(編集テンプレート)

@model Options.Sizes 

@{ 
    var values = Enum.GetValues(typeof(Options.Sizes)).Cast<Options.Sizes>(); 

    IEnumerable<SelectListItem> items = 
     from value in values 
     select new SelectListItem 
     { 
      Text = value.ToString(), 
      Value = value.ToString(), 
      Selected = (value.Equals(Options.Sizes.Small)) 
     }; 
} 

@Html.DropDownList("Size", items) 

Options.cs(列挙型を保持しているクラス)

public class Options 
{ 
    public enum Sizes 
    { 
     Small, 
     Medium, 
     Large 
    }; 
} 

Create.cshtml(表示)

@model = ProjectName.Models.Ball 

<form asp-action="Create" asp-controller="Ball"> 
    @Html.EditorForModel() 
    <input type="submit" value="submit"> 
</form> 

Ball.cs(モデル)

public class Ball 
{ 
    [Key] 
    public Nullable<int> ID { get; set; } 

    public string Name { get; set; } 

    public Options.Sizes Size { get; set; } 
} 

は、どういうわけか、ボールのサイズプロパティは、常に、'小'あるドロップダウン、の最初の値です。私が何を選んだとしても。

+0

選択した値を設定して送信しないとどうなりますか? –

+0

これは、実際には列挙型で宣言されているのと同じ順序でドロップダウンの最初の値を使用します。 –

+0

@ Html.EditorForModel()を@Html.DropDownListForに置き換えて試してみてください。 –

答えて

1

あなたのバージョンで、ブラウザのドロップダウンを検査した場合、あなたはそれが名前Size.Sizeを持って表示されます。これにより、Sizeという名前のものが必要なため、Createアクション(ここではBallモデルを期待していると仮定して、あなたがここに含まれていないと仮定して)に投稿するとバインディングが機能しなくなります。

最終ラインであるので、私はあなたのEditorTemplateを変更したときにそれは私の作品:

@Html.DropDownListFor(m => m, items) 

DropDownListForを使用するには、生成されたselect要素は、右の名前を取得しますが保証されます。

+0

これはそれでした。 'Html.DropDownList(" Size "、items)'を 'Html.DropDownList(" "items")に置き換えた場合でも動作します。あなたの助けをありがとう! –

0

value.toString(から.toString()を削除してみてください)

関連する問題