1

環境: MVC と Razor を使用した Entity Framework (v6.0)。バックエンドは SQL Server です。

HTML ヘルパー DropDownListFor() は、データベースの文字列列に対して完全に機能しています。ただし、数値ドロップダウンリストで10 進数列を使用すると、フォームがレンダリングされるときに、フレームワークはデータベースからロードされた値を選択しません。

これは、DropDownListFor() に Text と Value の両方の文字列が含まれており、データベースの 10 進数値と一致しないため、SelectedItem が決定されないという事実に関連していると思います。

HTML ヘルパー内でキャストしようとしましたが、コンパイルまたは実行時に失敗します。私が見つけることができるすべての例は、数値ではなく文字列を選択することを前提としています。

感謝して受け取った助け。ありがとう。

コードを表示: 問題のフィールドはCollarSizeです。ドロップダウン リストは CollarSizeSelect です。

<div class="form-group">
     @Html.LabelFor(model => model.CollarSize, htmlAttributes: new { @class = "control-label col-md-2" })
     <div class="col-md-10">
            @Html.DropDownListFor(model => model.CollarSize, Model.CollarSizeSelect, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.CollarSize, "", new { @class = "text-danger" })
     </div>
</div>

クラス定義には、次のように定義された列が含まれています。

public Nullable<decimal> CollarSize { get; set; }

CollarSize ドロップダウン リストは次のように作成されます。

public IEnumerable<SelectListItem> ChestSizeSelect
{
    get
    {
        return GetSelectNumberRange(32, 60, (decimal)1.0);
    }
}

private static List<SelectListItem> GetSelectNumberRange(int start, int end, decimal increment)
{
    List<SelectListItem> numlist = new List<SelectListItem>();
    for (decimal i = start; i <= end; i = i + increment)
    {
       numlist.Add(new SelectListItem() {Text = i.ToString(), Value = i.ToString()});
    }
    return numlist;
}
4

1 に答える 1

1

問題は SelectList の構築ではなく、基礎となるデータベース スキーマが原因でした。

データベース列:

CollarSize decimal(5, 2) NULL,

Entity Framework を使用して、データベースからモデルを構築しました (ウィザード オプション「データベースからの EF デザイナー」)。EF は、生成されたモデルでフィールドを生成しました。

public Nullable<decimal> CollarSize { get; set; }

DropDownListFor() に入力するために生成した SelectList には、小数項目のリストが含まれていましたが、これらの項目の精度は小数点以下 1 桁、つまり15.0M でした。ただし、EF は元の精度を保持していたため、DropDownList が設定されているときに、15.015.00を比較していたため、 Selected 項目が見つかりませんでした。

私の解決策は、明示的な精度で SelectList を構築することでした。

public IEnumerable<SelectListItem> CollarSizeSelect
{
    get
    {
         return new SelectList(new List<decimal> { 14.00M, 14.50M, 15.00M, 15.50M...
    }
}
于 2015-08-04T13:01:56.720 に答える