Ответ 1
Попробуйте это
Html.DropDownList("Types", Model.Types, new { @disabled = "disabled" })
Какой параметр мне нужно установить, чтобы сделать выпадающее поле только для чтения при использовании MVCs Html.DropDownList?
Я пробовал такие вещи, как....
Html.DropDownList("Types", Model.Types, new { _Enabled = "false" })
... и многое другое по этой линии; увы, нет радости!
Я думал, что это будет легко..... и, вероятно, это!
Попробуйте это
Html.DropDownList("Types", Model.Types, new { @disabled = "disabled" })
Что касается улова 22:
Если мы используем @disabled
, поле не будет отправлено в действие (Mamoud)
И если мы используем @readonly
, выпадающая ошибка по-прежнему позволяет вам изменить значение
Обходной путь: используйте @disabled
и добавьте поле, скрытое после выпадающего списка:
@Html.HiddenFor(model => model.xxxxxxxx)
Затем он действительно отключен и отправляется в действие также.
<script type="text/javascript">
$(function () {
$(document) .ajaxStart(function () {
$("#dropdownID").attr("disabled", "disabled");
})
.ajaxStop(function () {
$("#dropdownID").removeAttr("disabled");
});
});
</script>
Или вы можете попробовать что-то вроде этого:
Html.DropDownList("Types", Model.Types, new { @readonly = "true" })
Мне пришлось отключить выпадающий список и скрыть основной идентификатор
<div class="form-group">
@Html.LabelFor(model => model.OBJ_ID, "Objs", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("OBJ_ID", null, htmlAttributes: new { @class = "form-control", @disabled = "disabled"})
@Html.HiddenFor(m => m.OBJ_ID)
@Html.ValidationMessageFor(model => model.OBJ_ID, "", new { @class = "text-danger" })
</div>
</div>
Совет, который может быть очевиден для некоторых, но не для других..
Если вы используете HTML Helper, основанный на DropDownListFor
тогда ваш идентификатор будет продублирован во HiddenFor
данных HiddenFor
. Следовательно, у вас будут дубликаты идентификаторов, которые недопустимы в HTML, и если вы используете javascript для заполнения HiddenFor
и DropDownList
у вас возникнут проблемы.
Решение состоит в том, чтобы вручную установить свойство ID в массиве htmlattributes...
@Html.HiddenFor(model => model.Entity)
@Html.EnumDropDownListFor(
model => model.Entity,
new {
@class = "form-control sharp",
onchange = "",
id =' "EntityDD",
disabled = "disabled"
}
)
Я просто делаю это и называю это днем
Model.Id > -1 ? Html.EnumDropDownListFor(m => m.Property, new { disabled = "disabled" }) : Html.EnumDropDownListFor(m => m.Property)
Поместите это в стиле
select[readonly] option, select[readonly] optgroup {
display: none;
}
@Html.DropDownList("Types", Model.Types, new { @disabled = "" })
Работа
Html.DropDownList( "Типы", Model.Types, new {@disabled = "disabled" }) @Html.Hidden(Model.Types) и для сохранения и восстановления данных используйте скрытый элемент управления
Для полноты здесь есть HTML Helper для DropDownListFor, который добавляет включенный параметр, когда false select отключен. Он сохраняет html-атрибуты, определенные в разметке, или позволяет использовать html-атрибуты в разметке, отправляет значение select на сервер, и его использование очень чисто и просто.
Вот код для помощника:
public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, object htmlAttributes, bool enabled)
{
if (enabled)
{
return SelectExtensions.DropDownListFor<TModel, TProperty>(html, expression, selectList, htmlAttributes);
}
var htmlAttributesAsDict = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
htmlAttributesAsDict.Add("disabled", "disabled");
string selectClientId = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(ExpressionHelper.GetExpressionText(expression));
htmlAttributesAsDict.Add("id", selectClientId + "_disabled");
var hiddenFieldMarkup = html.HiddenFor<TModel, TProperty>(expression);
var selectMarkup = SelectExtensions.DropDownListFor<TModel, TProperty>(html, expression, selectList, htmlAttributesAsDict);
return MvcHtmlString.Create(selectMarkup.ToString() + Environment.NewLine + hiddenFieldMarkup.ToString());
}
и использование, цель состоит в том, чтобы отключить select, если в опциях есть только один элемент, разметка:
@Html.DropDownListFor(m => m.SomeValue, Model.SomeList, new { @class = "some-class" }, Model.SomeList > 1)
И есть еще один более элегантный пример HTML Helper, пока не поддерживающий публикацию (довольно прямолинейная работа, просто используйте HAP и добавьте скрытый ввод в качестве родного элемента и идентификатора обмена):
public static MvcHtmlString Disable(this MvcHtmlString previous, bool disabled, bool disableChildren = false)
{
if (disabled)
{
var canBeDisabled = new HashSet<string> { "button", "command", "fieldset", "input", "keygen", "optgroup", "option", "select", "textarea" };
var doc = new HtmlDocument();
doc.LoadHtml(previous.ToString());
var rootElements = doc.DocumentNode.Descendants().Where(
hn => hn.NodeType == HtmlNodeType.Element &&
canBeDisabled.Contains(hn.Name.ToLower()) &&
(disableChildren || hn.ParentNode.NodeType == HtmlNodeType.Document));
foreach (var element in rootElements)
{
element.SetAttributeValue("disabled", "");
}
string html = doc.DocumentNode.OuterHtml;
return MvcHtmlString.Create(html);
}
return previous;
}
Например, есть свойство модели bool AllInputsDisabled, когда true, все html-входы должны быть отключены:
@Html.TextBoxFor(m => m.Address, new { placeholder = "Enter address" }).Disable(Model.AllInputsDisabled)
@Html.DropDownListFor(m => m.DoYou, Model.YesNoList).Disable(Model.AllInputsDisabled)
Я создал этот ответ после ссылки на все комментарии и ответы. Это позволит решить проблему с выпадающим населением, даже если она отключена.
Шаг 01
Html.DropDownList("Types", Model.Types, new {@readonly="readonly"})