我想基于布尔值禁用或启用文本框,我创建了这个扩展方法:
public static IHtmlString MyTextBoxFor<TModel,TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel,TProperty>> expression,
object htmlAttributes,
bool disabled
)
{
var attributes = new RouteValueDictionary(htmlAttributes);
if (disabled)
{
attributes.Add("disabled", "\"disabled\"");
}
return htmlHelper.TextBoxFor(expression, htmlAttributes);
}
我的使用方式:
<div class="col-md-10">
@Html.MyTextBoxFor(model => model.Body, new { @class = "form-control"}, true)
</div>
但它不起作用,我是Htmlhelper课程的新手,虽然它不难理解,但我当然错过了一些东西!
修改
我尝试了这个简单的方法,找出问题所在:
public static IHtmlString MyTextBox(this HtmlHelper htmlHelper,object htmlAttributes, bool disabled)
{
IDictionary<string, object> attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
//var attrs = new Dictionary<string,string>();
if (disabled)
{
attrs.Add("disabled", "disabled");
attrs.Add("value", "txxxxxxt");
}
return htmlHelper.TextBox("txtbx", attrs);
}
这已经呈现:
<input id="txtbx" name="txtbx" type="text" value="System.Collections.Generic.Dictionary``2[System.String,System.String]">
答案 0 :(得分:2)
扩展方法的代码必须是
public static IHtmlString MyTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes, bool disabled)
{
IDictionary<string, object> attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
if (disabled)
{
attrs.Add("disabled", "disabled");
}
return htmlHelper.TextBoxFor(expression, attrs);
}
在您的第一个代码示例中,您使用了
return htmlHelper.TextBoxFor(expression, htmlAttributes);
返回原始属性,而不是包含disabled
属性的更新属性。应该是
return htmlHelper.TextBoxFor(expression, attributes);
在你的第二个代码示例中,使用TextBox()
方法而不是TextBoxFor()
和第二个参数是值,而不是属性,它应该是
return htmlHelper.TextBox("txtbx", null, attrs);
虽然由于name
属性不正确而无法绑定您的媒体资源。
旁注:有点不清楚为什么你会想要这样做。禁用的控件不提交值,因此您也可以在视图中将属性的值呈现为文本。如果您确实希望提交其值,那么它应该是readonly
,而不是disabled