簡體   English   中英

@ Html.EnumDropDownListFor-未設置下拉值

[英]@Html.EnumDropDownListFor - Dropdown values not being set

我有一個基本的表單,允許用戶輸入詳細信息,然后將其發布並保存到數據庫-可以按預期工作,沒有任何問題:

@model R32.Register.Models.RegisterCar
@{
    ViewBag.Title = "Edit Your R32";
}

<h2>Edit R32</h2>
<div>
    @using (Html.BeginForm("UpdateCar", "Garage", FormMethod.Post))
    {
        @Html.ValidationSummary(true)
        <fieldset>
            <legend>Enter details</legend>
            <ol>                   
                <li>
                    @Html.LabelFor(m => m.NumberPlate)
                    @Html.EditorFor(m => m.NumberPlate, new { @class = "form-control" })
                    @Html.ValidationMessageFor(m => m.NumberPlate)
                </li>                    
                <li>
                    @Html.LabelFor(m => m.Edition)
                    @Html.EnumDropDownListFor(m => m.Edition, "Select an edition:", new { @class = "form-control" })
                    @Html.ValidationMessageFor(m => m.Edition)
                </li>
                <li>
                    @Html.LabelFor(m => m.Colour)
                    @Html.EnumDropDownListFor(m => m.Colour, "Select a colour:", new { @class = "form-control" })
                    @Html.ValidationMessageFor(m => m.Colour)
                </li>                    
            </ol>
            <input type="submit" value="Save Changes" />
        </fieldset>
    }
</div>

模型片段:

[Required]
[Display(Name="Edition")]
public MkEnum? Edition { get; set; }

枚舉:

public enum MkEnum
{
    [Display(Name="Mk4")]
    Mk4 = 1,
    [Display(Name="Mk5")]
    Mk5 = 2
}

該控件將按預期方式呈現,其中“版本”下拉列表具有三個值:“選擇版本”,“ Mk4”和“ Mk5”。

用戶可以選擇一個版本,驗證控件,然后發布到控制器。

發布成功,並且所有選擇的值都發送到控制器-應用程序隨后將數據持久保存在數據庫中,依此類推,沒有任何問題。

問題是,當我將此模型傳遞回同一視圖以允許用戶編輯保存的數據時,枚舉的保存值未在下拉列表中設置為選定值。

我可以確認是否保存了任何字符串值,例如本示例中的NumberPlate,都將傳遞回視圖並加載到UI中。

在渲染時在視圖模型上放置一個斷點,我可以確認我的@model包含枚舉屬性的保存值(例如Edition),但最終結果是呈現了“ Select a edition:”下拉列表,其中包含預期的下拉值,但它的值是默認的“選擇版本:”,而不是通過via傳遞的實際值。 m.Edition。

我已經能夠使用DropDownListFor使其正常工作-但難以理解為什么使用EnumDropDownListFor不能正常工作,因為這顯然是一個更優雅的解決方案。

有人對此有任何幫助/建議嗎?

我自己碰到了這個問題。 發生這種情況的原因是,枚舉類型的字段將作為其枚舉名稱序列化返回給瀏覽器,但是@ Html.EnumDropDownListFor會將其選項值生成為整數。 瀏覽器無法將兩者匹配,因此下拉菜單保持默認設置。

有3種方法可以解決此問題。

  1. 獲取視圖模型的枚舉字段,以將其正確序列化為一個int。
  2. 編寫一個使用枚舉名稱作為選項值的下拉生成器。
  3. 使用javascript手動選擇選項(此處包含剃須刀語法)

     $("#YourDropdownID option").each(function () { if ($(this).html() == '@(Html.DisplayFor(o => o.YourEnumFieldName))') { $(this).attr("selected", "selected"); return; } }); 

好的,所以從我可以看到的問題是由使用ActionLink傳回正在編輯的項目的完整模型引起的。 一切都以查詢字符串的形式發送回去,因此我的Enum值通過以下方式傳遞給控制器​​:mkEnum = Mk4。

然后,如上例所示,我正在加載UpdateCar視圖-但查詢字符串值仍保留在對View的調用中。

EnumDropDownListFor無法將枚舉的文本值解釋/轉換為實際值-如果我將Query字符串手動編輯為mkEnum = 1,則將正確的值加載到ViewModel中。

除此問題外,將完整模型傳遞回控制器也不是一個好的解決方案。 我已經修改了代碼,以傳遞回正被編輯的項目的單個ID-控制器然后驗證用戶是否有權訪問該ID,從數據庫中檢索Model,然后將其傳遞回與上述示例相同的View。

通過此更改,我的下拉列表現在可以使用其值進行更新,而不會出現任何問題。

TLDR; 如果遇到此問題,請檢查以確保在加載視圖和使用EnumDropDownListFor時,查詢字符串中沒有模型屬性,特別是由其字符串值表示的枚舉值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM