我正在尝试根据模型属性在我的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"是假的,然后它也显示下拉列表已禁用。
请在不使用任何javascript的情况下建议如何处理此问题
提前致谢
答案 0 :(得分:5)
在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条件检查Model属性的值,并有条件地呈现禁用的版本。
@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)
答案 1 :(得分:0)
这是一个HTML基本规则:从您设置属性disabled
的那一刻起(无论其值如何),该元素将被禁用。
要获得所需内容,您需要创建HTML扩展程序DropDownListFor
。
请参阅this link.
答案 2 :(得分:0)
Shyju接受的答案很有效。但是,如果您想在自定义助手中使用 HTML5数据 - * 属性,该怎么办?标准MVC DropDownListFor 通过使用下划线(_)代替短划线( - )来提供解决方法。并且该帮助程序足够智能,可以在呈现标记时将下划线转换为破折号。
这是一个自定义帮助程序,它将提供一个参数来禁用DropDownList,并相应地转换 HTML5数据 - * 属性。它还会保留通过 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)