Отключить включить dropdownlist для на основе свойства модели в mvc

Я пытаюсь отключить или включить раскрывающийся список для моего приложения MVC на основе свойства модели: -

что я делаю это:

@Html.DropDownListFor(m => m.ParentOrganisationID, new SelectList(Model.ParentOrganisations, "ID", "Name", Model.ParentOrganisationID), new { @id = "ddlParentOrganisations", @class = "form-control css-select", @disabled = Model.IsReadOnly ? "disabled" : "false", @style = "width:40%; height:10%;" })

но даже если свойство модели "model.IsReadOnly" имеет значение false, раскрывающийся список также отображается как отключенный.

Пожалуйста, предложите, как справиться с этим, без использования JavaScript

заранее спасибо

Ответы на вопрос(3)

Принятый ответ от Shyju прекрасно работает. Но что, если вы хотите использоватьHTML5 data- * атрибуты в вашем пользовательском помощнике? Стандарт MVCDropDownListFor предоставляет обходной путь, используя подчеркивание (_) вместо тире (-). И этот помощник достаточно умен, чтобы преобразовывать подчеркивания в тире при визуализации разметки.

Вот пользовательский помощник, который предоставит параметр для отключения DropDownList, а также преобразуетHTML5 data- * атрибуты соответственно. Он также сохраняет любые другие значения, переданные черезhtmlAttributes параметр. Код также немного более лаконичен (imo).

    public static MvcHtmlString MyDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> list, string optionLabel, object htmlAttributes, bool disabled)
    {
        var routeValues = new System.Web.Routing.RouteValueDictionary();

        // convert underscores to dashes...
        foreach (System.ComponentModel.PropertyDescriptor property in System.ComponentModel.TypeDescriptor.GetProperties(htmlAttributes))
        {
            routeValues.Add(property.Name.Replace('_', '-'), property.GetValue(htmlAttributes));
        }

        if(disabled)
        {
            routeValues.Add("disabled", "disabled");
        }

        return htmlHelper.DropDownListFor(expression, list, optionLabel, routeValues);
    }

И разметка:

@Html.MyDropDownListFor(m => m.MonthId, Model.Months, "Select Month", new { @class = "form-control", data_url = Url.Action("GetMonths") }, Model.IsDisabled)

Это базовое правило HTML: с момента установки атрибутаdisabled (независимо от его значения), элемент будет отключен.

Чтобы получить то, что вы хотите, вам нужно создать расширение HTMLDropDownListFor.

Посмотри пожалуйстаэта ссылка.

Решение Вопроса

Невозможно включить условие (если / троичный оператор (ы)) в вызов кDropDownListFor вспомогательный метод, потому что вы не можете передать строку кода c # (с вашим условием if), где он ожидает объект для атрибутов html. Также все перечисленные ниже пометки будут отображать отключенный SELECT.

<select disabled></select>
<select disabled="disabled"></select>
<select disabled="false"></select>
<select disabled="no"></select>
<select disabled="usingJqueryEnablePlugin"></select>
<select disabled="enabled"></select>

Вы можете просто проверить значение вашего свойства Model с условием if и условно отобразить отключенную версию.

@if (!Model.IsReadOnly)
{
    @Html.DropDownListFor(s => s.ParentOrganisationID, 
                               new SelectList(Model.ParentOrganisations, "ID", "Name"))
}
else
{
    @Html.DropDownListFor(s => s.ParentOrganisationID, 
       new SelectList(Model.ParentOrganisations, "ID", "Name"),new {disabled="disabled"})
}

Вы можете создать собственный вспомогательный метод html, который позаботится о проверке условий if.

public static class DropDownHelper
{
    public static MvcHtmlString MyDropDownListFor<TModel, TProperty>
                 (this HtmlHelper<TModel> htmlHelper, 
                  Expression<Func<TModel, TProperty>> expression,
                  IEnumerable<SelectListItem> selectItems,
                  object htmlAttributes,
                  bool isDisabled = false)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression,
                                                                    htmlHelper.ViewData);

        IEnumerable<SelectListItem> items =
            selectItems.Select(value => new SelectListItem
            {
                Text = value.Text,
                Value = value.Value,
                Selected = value.Equals(metadata.Model)
            });
        var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
        if (isDisabled && !attributes.ContainsKey("disabled"))
        {
             attributes.Add("disabled", "disabled");
        }
        return htmlHelper.DropDownListFor(expression,items, attributes);
    }
}

Теперь, по вашему мнению, позвоните этому помощнику

@Html.MyDropDownListFor(s=>s.ParentOrganisationID,
               new SelectList(Model.ParentOrganisations, "ID", "Name")
                                           ,new { @class="myClass"},Model.IsReadOnly)
 Shyju06 июл. 2016 г., 20:25
Смотрите обновленный ответ.
 tanuj shrivastava06 июл. 2016 г., 16:41
У меня есть несколько выпадающих списков, по моему мнению, около 20, поэтому для всех них я должен написать это условие ... Не существует ли обходной путь?
 tanuj shrivastava08 июл. 2016 г., 12:13
Моя проверка на стороне клиента MVC не работает при использовании этого html.extension
 tanuj shrivastava06 июл. 2016 г., 17:29
@ shyju- Но я также предоставляю идентификатор и класс в новом атрибуте {html}, по-вашему, я не смогу передать их
 tanuj shrivastava07 июл. 2016 г., 09:42
дааа теперь все работает отлично ... спасибо @shyju
 Shyju06 июл. 2016 г., 17:18
@tanujshrivastava Да. Вы можете создать собственный помощник для этого. Проверьте мой обновленный ответ.

Ваш ответ на вопрос