Как отключить опцию по умолчанию в Razor SelectListItem? - PullRequest
0 голосов
/ 29 ноября 2018

Как сделать так, чтобы опция выбора бритвы ниже отключала опцию выбора?

@Html.DropDownListFor(model => model.RiskChange, new List<SelectListItem>
      {                                      
        new SelectListItem{ Text="Low", Value = "Low" },
        new SelectListItem{ Text="Medium", Value = "Medium" },
        new SelectListItem{ Text="High", Value = "High" },
      }, "Select", new { @class = "form-control" , onchange = "onRiskChange()" })

Чтобы она работала следующим образом.

<select class="form-control"  name="RiskChange" >
         <option selected="true" disabled="disabled">Select</option>
         <option value="Low" >Low</option>
         <option  value="Medium"  >Medium</option>
         <option  value="High" >High</option>
</select>

1 Ответ

0 голосов
/ 29 ноября 2018

К сожалению, по умолчанию SelectListItem не имеет свойства для атрибута disabled (и нет способа создать атрибут disabled из optionLabel), поэтому вы не можете установить атрибут disabled в элементе option, используя стандартныеDropDownListFor.Однако вы можете создать собственный помощник, который использует для этой цели атрибут disabled:

public static class CustomHelper
{
    public static MvcHtmlString CustomDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel, object htmlAttributes)
    {   
        if (expression == null)
        {
            throw new ArgumentNullException("expression");
        }

        ModelMetadata metadata = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, htmlHelper.ViewData);
        string expressionName = ExpressionHelper.GetExpressionText(expression);
        string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expressionName);

        if (String.IsNullOrEmpty(fullName))
        {
            throw new ArgumentException("name");
        }

        var builder = new TagBuilder("select");

        // add default attributes here
        builder.Attributes.Add("name", fullName);

        // merge htmlAttributes here

        if (htmlAttributes != null)
        {
            var attr = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
            builder.MergeAttributes(attr);
        }

        var sb = new StringBuilder();

        // if option label contains any string value,
        // create option placeholder with disabled and selected attribute
        if (!string.IsNullOrEmpty(optionLabel))
        {
            sb.Append(string.Format("<option selected='true' disabled='disabled'>{0}</option>", optionLabel));
        }

        foreach (var item in selectList)
        {
            sb.Append(string.Format("<option value='{0}'>{1}</option>", item.Value, item.Text));
        }

        builder.InnerHtml = sb.ToString();
        return MvcHtmlString.Create(builder.ToString(TagRenderMode.Normal));
    }
}

Использование

@Html.CustomDropDownListFor(model => model.RiskChange, Model.RiskOptions, "Select", new { @class = "form-control" , onchange = "onRiskChange()" })

Примечание: Аналогичный способ создания списков параметров с настраиваемыми атрибутами можно найти здесь .

Ссылка: Метод SelectExtensions.DropDownListFor ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...