asp.net mvc - kendo - Html.DropDownList-Disabled/Readonly
select readonly (12)
En cuanto a la captura 22:
Si usamos @disabled
, el campo no se envía a la acción (Mamoud) Y si usamos @readonly
, el error desplegable aún le permite cambiar el valor
Solución alternativa: use @disabled
y agregue el campo oculto después del menú desplegable:
@Html.HiddenFor(model => model.xxxxxxxx)
Entonces está verdaderamente deshabilitado y enviado a la acción también.
¿Qué opción debo configurar para crear un cuadro desplegable de manera que solo se use MVC Html.DropDownList?
He intentado cosas como ...
Html.DropDownList("Types", Model.Types, new { _Enabled = "false" })
... y muchas cosas diferentes a lo largo de esta línea; ¡ay no hay alegría!
Pensé que esto sería fácil ... ¡y probablemente lo sea!
He creado esta respuesta después de referirme a todos los comentarios y respuestas. Esto resolverá el error de población desplegable incluso si se desactiva.
Paso 01
Html.DropDownList("Types", Model.Types, new {@readonly="readonly"})
Paso 02 Esto es css pointerevent eliminar el código.
<style type="text/css">
#Types {
pointer-events:none;
}
</style>
Probado y probado
Html.DropDownList ("Types", Model.Types, new {@disabled = "disabled"}) @ Html.Hidden (Model.Types) y para guardar y recuperar los datos, use un control oculto
O puedes probar algo como esto:
Html.DropDownList("Types", Model.Types, new { @readonly = "true" })
Para completar, aquí está HTML Helper for DropDownListFor que agrega parámetros habilitados, cuando la selección falsa está deshabilitada. Mantiene los atributos html definidos en el marcado, o permite el uso de atributos html en el marcado, publica el valor de selección en el servidor y el uso es muy simple y limpio.
Aquí está el código para el ayudante:
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());
}
y el uso, el objetivo es desactivar seleccionar si solo hay un elemento en las opciones, marcado:
@Html.DropDownListFor(m => m.SomeValue, Model.SomeList, new { @class = "some-class" }, Model.SomeList > 1)
Y hay un ejemplo aún más elegante de HTML Helper, sin soporte de publicaciones por ahora (trabajo bastante simple, simplemente use HAP y agregue entradas ocultas como elemento raíz hermano e id de intercambio):
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;
}
Por ejemplo, hay una propiedad de modelo bool AllInputsDisabled, cuando true todas las entradas html deben estar deshabilitadas:
@Html.TextBoxFor(m => m.Address, new { placeholder = "Enter address" }).Disable(Model.AllInputsDisabled)
@Html.DropDownListFor(m => m.DoYou, Model.YesNoList).Disable(Model.AllInputsDisabled)
Pon esto con estilo
select[readonly] option, select[readonly] optgroup {
display: none;
}
Prueba esto
Html.DropDownList("Types", Model.Types, new { @disabled = "disabled" })
Solo hago esto y lo llamo un día
Model.Id > -1 ? Html.EnumDropDownListFor(m => m.Property, new { disabled = "disabled" }) : Html.EnumDropDownListFor(m => m.Property)
Tuve que deshabilitar la lista desplegable y ocultar la ID principal
<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>
Un consejo que puede ser obvio para algunos, pero no para otros.
Si está utilizando HTML Helper basado en DropDownListFor
, su ID se duplicará en la entrada de HiddenFor
. Por lo tanto, tendrá identificaciones duplicadas que no son válidas en HTML y si está utilizando javascript para llenar HiddenFor
y DropDownList
entonces tendrá un problema.
La solución es establecer manualmente la propiedad ID en la matriz htmlattributes ...
@Html.HiddenFor(model => model.Entity)
@Html.EnumDropDownListFor(
model => model.Entity,
new {
@class = "form-control sharp",
onchange = "",
id =` "EntityDD",
disabled = "disabled"
}
)
<script type="text/javascript">
$(function () {
$(document) .ajaxStart(function () {
$("#dropdownID").attr("disabled", "disabled");
})
.ajaxStop(function () {
$("#dropdownID").removeAttr("disabled");
});
});
</script>
@Html.DropDownList("Types", Model.Types, new { @disabled = "" })
Trabajos