1

我爲我使用的一些枚舉創建了幾個EditorTemplates,這樣當我使用EditorForModel()時它們將顯示爲DropDownLists。但是,當我從列表中選擇一個項目後提交表單時,它始終在下拉列表中提交第一個項目,而不是選定的項目。枚舉DropDownList總是返回列表中的第一個值

舉例來說,如果我有一個枚舉叫做「尺寸」它具有價值「小」「中」「大」。 EditorForModel將創建一個下拉框,以的順序顯示「小」,'中','大'。如果我然後選擇'Large',然後查看數據庫中的模型條目的詳細信息,則會顯示'Small'這是不正確的。

這裏是什麼,我有一些示例代碼:

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

它仍然使用下拉列表中的第一個值,它們與enum –

+0

中聲明的順序相同,您可以使用@ Html.DropDownListFor替換@ Html.EditorForModel()並嘗試。 –

回答

1

如果您檢查瀏覽器的下拉列表中,你的版本,你會看到它的名稱爲Size.Size。這會導致綁定在發佈到Create動作時發生作用(假設這只是預期Ball模型,因爲您未在此處包含此模型),因爲該名稱的名稱爲Size

這對我的作品時,我改變你的EditorTemplate所以最後一行是:

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

使用DropDownListFor確保產生select元素得到正確的名稱。

+0

就是這樣。如果我用'Html.DropDownList(「」,items)''替換'Html.DropDownList(「Size」,items)',它也可以。非常感謝你的幫助! –

0

嘗試去除value.toString的ToString()()

相關問題