HtmlHelper
を介して次のHTMLを吐き出すSelectListItem
を作成する方法がわかりません。
<option disabled="disabled">don't click this</option>
SelectListItem
のプロパティは次のとおりです。
new SelectListItem{
Name = "don't click this",
Value = string.Empty,
Selected = false
}
私が見る唯一のオプションは
SelectListItem
をサブクラス化してEnabled
プロパティを追加し、ビューに値を取得しますHtmlHelper
を受け入れ、EnablableSelectList
属性を追加する新しいdisabled
拡張機能を作成します。これは、ヘルパーを完全に再作成する前に試すかもしれません。基本的な考え方は、ヘルパーから取得する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());
}
}
Disabled
プロパティは、ASP.NET MVC5.2以降でサポートされています。
new SelectListItem {
// ...
Disabled = true
}
APIリファレンス を参照してください。
クライアントサイドオプション:たとえば、ドロップダウンリストにクラス 'custom'を指定し、選択不可にする必要のある項目に値-1(たとえば)を指定すると、次のようになります。
$('select.custom option[value=-1]').each(function () {
$(this).attr("disabled", "disabled");
});
ユーザーがリストから特定の値を選択できないようにするだけの場合は、入力検証を使用するのがより簡単で時間効率の良い方法のようです。彼らが最初に選択をしたことを確認したいのであれば、とにかくそれをしている可能性が非常に高いです。
-----オプション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" })