在 mvc 中禁用基于模型 属性 的启用下拉列表
Disable enable dropdownlistfor based on model property in 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
提前致谢
无法在对 DropDownListFor
辅助方法的调用中包含条件(if/ternary 语句),因为您无法传递一行 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>
您可以简单地使用 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)
这是一个 HTML 基本规则:从您设置属性 disabled
的那一刻起(无论其值如何),该元素将被禁用。
要得到你想要的,你需要创建一个 HTML 扩展 DropDownListFor
。
请看this link.
Shyju 接受的答案非常有效。但是,如果您想在自定义助手中使用 HTML5 data-* 属性怎么办?标准 MVC DropDownListFor 通过使用下划线 (_) 代替破折号 (-) 提供了一种解决方法。并且该助手足够智能,可以在呈现标记时将下划线转换为破折号。
这是一个自定义帮助程序,它将提供一个参数来禁用 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)
我试图在我的基于模型 属性 的 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
提前致谢
无法在对 DropDownListFor
辅助方法的调用中包含条件(if/ternary 语句),因为您无法传递一行 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>
您可以简单地使用 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)
这是一个 HTML 基本规则:从您设置属性 disabled
的那一刻起(无论其值如何),该元素将被禁用。
要得到你想要的,你需要创建一个 HTML 扩展 DropDownListFor
。
请看this link.
Shyju 接受的答案非常有效。但是,如果您想在自定义助手中使用 HTML5 data-* 属性怎么办?标准 MVC DropDownListFor 通过使用下划线 (_) 代替破折号 (-) 提供了一种解决方法。并且该助手足够智能,可以在呈现标记时将下划线转换为破折号。
这是一个自定义帮助程序,它将提供一个参数来禁用 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)