web-dev-qa-db-ja.com

disabled = "disabled"属性を使用してSelectListItemを作成する

HtmlHelperを介して次のHTMLを吐き出すSelectListItemを作成する方法がわかりません。

<option disabled="disabled">don't click this</option>

SelectListItem のプロパティは次のとおりです。

new SelectListItem{
  Name = "don't click this",
  Value = string.Empty,
  Selected = false
}

私が見る唯一のオプションは

  1. SelectListItemをサブクラス化してEnabledプロパティを追加し、ビューに値を取得します
  2. DropDownListのHTMLヘルパー を使用しないでください
  3. 新しいHtmlHelperを受け入れ、EnablableSelectList属性を追加する新しいdisabled拡張機能を作成します。
26
Mark

これは、ヘルパーを完全に再作成する前に試すかもしれません。基本的な考え方は、ヘルパーから取得するHtmlは整形式である必要があるため、安全に解析できる必要があるということです。したがって、既存の拡張機能を使用しながら、アイテムを無効にする機能を追加する独自の拡張機能を作成することで、そのアイデアに基づいて構築できます。

このようなことが起こるかもしれません(完全にテストされていません)

public class CustomSelectItem : SelectListItem
{
    public bool Enabled { get; set; }
}

public static class CustomHtmlHelpers
{
    public static MvcHtmlString MyDropDownList(this HtmlHelper html, IEnumerable<CustomSelectItem> selectList)
    {
        var selectDoc = XDocument.Parse(html.DropDownList("", (IEnumerable<SelectListItem>)selectList).ToString());

        var options = from XElement el in selectDoc.Element("select").Descendants()
                                    select el;

        foreach (var item in options)
        {
            var itemValue = item.Attribute("value");
            if (!selectList.Where(x => x.Value == itemValue.Value).Single().Enabled)
                item.SetAttributeValue("disabled", "disabled");
        }

        // rebuild the control, resetting the options with the ones you modified
        selectDoc.Root.ReplaceNodes(options.ToArray());
        return MvcHtmlString.Create(selectDoc.ToString());
    }
}
20
Jab

Disabledプロパティは、ASP.NET MVC5.2以降でサポートされています。

new SelectListItem {
    // ...
    Disabled = true
}

APIリファレンス を参照してください。

23
Mihkel Müür

クライアントサイドオプション:たとえば、ドロップダウンリストにクラス 'custom'を指定し、選択不可にする必要のある項目に値-1(たとえば)を指定すると、次のようになります。

$('select.custom option[value=-1]').each(function () {
    $(this).attr("disabled", "disabled");
});
5
staccata

ユーザーがリストから特定の値を選択できないようにするだけの場合は、入力検証を使用するのがより簡単で時間効率の良い方法のようです。彼らが最初に選択をしたことを確認したいのであれば、とにかくそれをしている可能性が非常に高いです。

0
Thyamine

-----オプション1コントローラー:

var ExpectedShipmentsRange = new List();

ExpectedShipmentsRange.Add(new SelectListItem() { Text = "Selected number of shipments", Value="0", Disabled = true, Selected  = true });
ExpectedShipmentsRange.Add(new SelectListItem() { Text = "0 to 20 shipments", Value = "0-20" });
ExpectedShipmentsRange.Add(new SelectListItem() { Text = "20 to 40 shipments", Value = "20-40" });

ViewBag.ExpectedShipmentsRange = ExpectedShipmentsRange;

見る:

@Html.DropDownListFor(m => m.ExpectedShipments, (IEnumerable<SelectListItem>)@ViewBag.ExpectedShipmentsRange, new { @class = "form-control" })

-----オプション2コントローラー:

ViewBag.citiesSa = _dbContext.Countries.ToList();

見る:

@Html.DropDownListFor(m => m.City, new SelectList(@ViewBag.citiesSa, "Id", "Name"), "Select your city", new { @class = "form-control" })

-----オプション3は無効なオプションをサポートしていません:

List<SelectListItem> ExpectedShipmentsRange = new List<SelectListItem>();
ExpectedShipmentsRange.Add(new SelectListItem() { Text = "0 to 20 shipments", Value = "0-20" });
ExpectedShipmentsRange.Add(new SelectListItem() { Text = "20 to 40 shipments", Value = "20-40" });

ViewBag.ExpectedShipmentsRange = new SelectList(ExpectedShipmentsRange, "Value", "Text");

見る:

@Html.DropDownListFor(m => m.ExpectedShipments, (SelectList)@ViewBag.ExpectedShipmentsRange, new { @class = "form-control" })
0
Adel Mourad